2012-12-14 24 views
3

我知道(通過這裏讀上無數的帖子在SO和其他網站)持久連接是不是絕大多數的開發者非常喜愛(如果該腳本終止突然,連接沒有得到封閉,你可能最終留下一些表格鎖定等),但它真的很糟糕?PHP&PDO - 是否有任何方法可以實現'安全'持續連接?

在我的機器(T3400雙核CPU,內存4 GB的和5400RPM硬盤),頁面加載時間非常不同取決於我是否使用永久或非永久連接。非持久連接與2.09s非常不同,對於持續連接(大致)爲68ms。以下是您可以看到的兩個示例屏幕截圖:non-persistentpersistent

我理解的持久連接的風險(我真的不使用它們每天的基礎上,雖然我覺得這個概念有趣,我想探索的話),但不存在任何檢測非法 - 關閉連接?

就像例如,相當於mysqli的change_user,但是對於PDO或某種PHP腳本,服務器每隔X秒運行一次cron作業以檢查剩餘的並隨後關閉它們?我正在閱讀register_shutdown_function,但是如果我理解正確,腳本完成後就會調用它,實際上,這可能意味着每次腳本結束時它都會結束持久連接。或者我錯了?

編輯

我忘了說我的軟件堆棧,爲準確起見,所以讓我修改的那個。我目前的堆棧由以下元素:Windows 7 (x86) SP1作爲操作系統,Apache 2.4.3PHP 5.4.9MySQL 5.5.28(我總是用最新版本的工作)。運行堆棧爲localhost(我可能將其遷移到專用機器,但現在,它仍然是這樣)。

+2

我覺得很奇怪,在本地機器上建立MySQL連接的代價是2秒。這裏有什麼可疑的東西,你確定這是持續性還是非持久性,導致了性能的劇烈變化?使用持續連接可能不是治癒的問題,但問題仍然存在,我會尋找罪魁禍首,而不是用潛在危險的事物來糾正問題。 –

+0

對不起,就像我剛纔評論@ hek2mgl的答案一樣,我正在創建兩個持久連接。一個用於核心應用程序數據庫(我想要存儲客戶賬單信息和幾件事情),另一個用於客戶數據庫(所有應用程序模塊將存儲他們的數據,例如報價單,訂單,發票,交貨單等等上)。我的實際代碼測試看起來像'$ sql ['core'] = $ database-> addConnection(「core」); $ sql ['client'] = $ database-> addConnection(「client」);'。因此那兩秒鐘。每個連接一秒鐘。 –

+2

1秒仍然太多。在沒有負載且有足夠RAM可用的機器上,db連接的時間不應超過幾毫秒。 –

回答

2

爲了避免連接將上你可以在你關機功能檢查error_get_last()每次關機關閉。

注意error_get_last()也將返回「錯誤」像E_NOTICE等,這應該根據您的需要被過濾掉。

<?php 

register_shutdown_function('shutdown'); 

function shutdown() { 

    static $ignore = array (
     E_STRICT, 
     E_NOTICE, 
     E_USER_NOTICE, 
     E_DEPRECATED, 
     E_USER_DEPRECATED, // ... 
    ); 

    $error = error_get_last(); 
    // if no error has been queued or it should be ignored ... 
    if(is_null($error) || in_array($error['type'], $ignore)) { 
     return; // do nothing 
    } 

    // here comes your connection close code 
    connection_close($your_connection); 
} 

但這是有很多限制see www.php.net的真正哈克的解決方案。

我不知道,因爲〜2秒需要使用非永久連接時,服務頁面。這是否意味着建立與數據庫服務器的連接需要〜2秒?如果是這樣,我會照顧它,因爲它看起來很長。你使用什麼數據庫服務器?數據庫服務器位於不同的機器上嗎?

+0

對不起,我需要更具體些。這2秒來自我調用我的'addConnection'方法兩次(我創建了兩個持久連接),因此每個連接約1秒。 –

+0

好的,但我確認了上面的N.B.的評論。在硬件上建立連接應該不超過〜10ms。 – hek2mgl

+0

這是一個具有非常糟糕的地址解析的Windows(指定127.0.0.1而不是'localhost'減輕了我的慢速問題)並使用真正的解決方案的組合:使用Linux。現在連接時間在11到21ms之間。現在很正常:P –

相關問題