首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP MySQL 連接最佳實踐:避免流量異常的正確姿勢

     編輯:程式設計綜合問答

問題現象

在頁面頭部 require_once('Connections/member.php') 連接數據庫,但頻繁導致流量異常。代碼中主機、用戶名、密碼均為空串直接連接。

核心問題

  • 憑證為空:$hostname_member = "" 等同於 localhost,但無密碼連接極不安全,且可能被拒絕導致重試風暴。
  • 缺乏錯誤處理與連接復用:每次請求建立新連接,未使用持久連接或連接池。
  • 使用已棄用的 mysql_* 擴展:PHP 7+ 已移除,應改用 mysqli 或 PDO。

改進方案(PDO + 單例模式)

<?php
// Connections/member.php
class DB {
    private static $instance = null;
    private $pdo;

    private function __construct() {
        $dsn = 'mysql:host=127.0.0.1;dbname=your_db;charset=utf8mb4';
        $this->pdo = new PDO($dsn, 'db_user', 'db_pass', [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_PERSISTENT => true,   // 持久連接
            PDO::ATTR_EMULATE_PREPARES => false,
        ]);
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getPDO() {
        return $this->pdo;
    }
}

// 使用方式
$pdo = DB::getInstance()->getPDO();
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
?>

關鍵優化點

  1. 配置分離:將 DSN、用戶名、密碼放入 .env 或獨立配置文件,不硬編碼。
  2. 預處理語句:防 SQL 注入,提升重複查詢性能。
  3. 持久連接:PDO::ATTR_PERSISTENT 減少握手開銷。
  4. 異常模式:ERRMODE_EXCEPTION 統一錯誤處理。
  5. 關閉連接:PHP 腳本結束自動回收,長運行腳本可手動 $pdo = null。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved