2016-07-06 25 views
0

我有一臺服務器上的一個Apache/PHP應用程序和第二服務器上的PostgreSQL數據庫。它們被配置爲通過SSL連接。一切正常,但即使$db->setAttribute(PDO::ATTR_PERSISTENT, true);在腳本中,TCP連接始終關閉。 PHP.INI有pgsql.allow_persistent = Onpgsql.auto_reset_persistent = Offpgsql.max_persistent = 30pgsql.max_links = 30。使用sudo netstat -nap我可以看到兩臺服務器之間沒有ESTABLISHED連接。我還需要做些什麼來保持連接暢通?每個請求的新連接開銷爲10-12毫秒。PHP的PostgreSQL的持久連接始終貼近

+0

使用連接池像pgBouncer。總是。 –

回答

0

我發現這個便條一種公平的方式下PHP手冊頁面:

如果你想使用持久連接,則必須設置 PDO :: ATTR_PERSISTENT的驅動程序選項傳遞給數組中PDO 構造函數。如果後 實例化對象的設置與PDO ::的setAttribute()這個屬性,驅動程序將不會使用持久 連接。

這就是我出了問題。我用的是這樣的:

$host = explode('.',$_SERVER['SERVER_NAME']); 
$db = new PDO($host[0]); 
$db->setAttribute(PDO::ATTR_PERSISTENT, true); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

當我本來應該這樣做:

$host = explode('.', $_SERVER['SERVER_NAME']); 
$db = new PDO($host[0],null,null,array(PDO::ATTR_PERSISTENT=>true, 
     PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 
     PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC)); 

的DSN的是在一個pdo.ini文件。幸運的是,null用戶和密碼被忽略,否則這也不起作用。現在new PDO需要0.02毫秒,而不是10毫秒。