2014-02-05 72 views
1

我目前通過創建PDO爲我的網站,像這樣一個數據庫連接:peristent PDO MySQL連接方案

try { 
    self::$dbh = new PDO("mysql:host={$host};dbname={$dbName}", $dbUser, $dbPass); 
    self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
} 
catch (PDOException $e) { 
    return $e->getMessage(); 
} 

我一直在閱讀有關的持久連接,所以我想添加的持續標誌,像這樣:

self::$dbh = new PDO("mysql:host={$host};dbname={$dbName}", $dbUser, $dbPass, 
    array(PDO::ATTR_PERSISTENT => true  
)); 

從我一直在reading這可能是危險的,如果發生中等查詢等等。這聽起來像這不是一個真正的推薦方法。

是否有任何其他替代方案來維持與MySQL的持久數據庫連接?

+1

你在說什麼「東西」?你在使用交易嗎? – tadman

+0

我們在談論什麼樣的「危險」? – PeeHaa

+0

看到我上面的「閱讀」鏈接 – Paul

回答

2

使用持久連接的原因是您每秒有大量的PHP請求,並且您絕對需要性能百分比中的每一分之一。

即使創建一個新的MySQL連接真的非常便宜(與連接到Oracle或其他)相比,您可能會試圖減少這種開銷。請記住,儘管如此,大多數網站相處得很好,但沒有這樣做。這取決於您的流量有多沉重。此外,MySQL 5.6和5.7使創建新連接的效率更高,因此如果升級,則開銷更低。

您鏈接到的帖子中描述的風險是特定於會話的狀態沒有得到清理,因爲給定的數據庫連接被後續的PHP請求繼承。會話狀態的

例子包括:

  • 未完成的事務
  • 臨時表
  • 用戶變量
  • 連接字符集

這甚至可以是一個安全問題,例如如果一個PHP用戶使用特權信息填充臨時表,然後另一個PHP用戶發現他們可以閱讀它。

幸運的是,在@Charles給出他的回答後的4年中,mysqlnd驅動已經解決了這個問題。它現在使用mysql_change_user(),它就像是一個「軟斷開」,它會重置所有這些會話狀態的詳細信息,但不會釋放套接字。因此,您可以獲得永久連接的好處,而不會將會話狀態從一個PHP請求泄漏到另一個。請參閱http://www.php.net/manual/en/mysqlnd.persist.php

這需要啓用mysqlnd驅動程序,如果您使用任何合理的最新版本的PHP,它應該是。

+0

+1,值得注意的是,當我在2010年編寫回答時,mysqlnd不可用,並且調用'mysqli_change_user'作爲解決方案甚至不被視爲解決方法。 – Charles

+0

@Charles,是的,你的回答是完全正確的。 –

-2

爲什麼你需要一個持久連接? PHP是無狀態的,每次發出請求時都會重新初始化,因此在使用持久連接時,大多沒有任何優勢和更多缺點(即突然斷開而沒有處理程序)。