問題介紹
最近有 php 使用者反饋對雲資料庫 memcache 版做效能測試的結果,達不到預期的效能指標。通過了解具體情況,大多數使用者在使用 php 連線雲資料庫 memcache 版時,都是通過走 apache web 服務再連雲資料庫 memcache 版,使用的是短連線。而每個短連線的開銷不止是 socket 重連,還有複雜的重新鑑權流程,開銷比乙個普通請求大許多,因此對**的效率是有很大影響的。
解決方案
在php 官網介紹 memcached 建構函式時有下面一段話:
說明memcached::__construct ([ string $persistent_id ] )建立乙個代表到memcached服務端連線的memcached例項。
引數persistent_id預設情況下,memcached例項在請求結束後會被銷毀。但可以在建立時通過persistent_id為每個例項指定唯一的id, 在請求間共享例項。所有通過相同的persistent_id值建立的例項共享同乙個連線。
即在呼叫建構函式時傳給它乙個同樣的 persistent_id 就能實現共享連線。**實現如下:
$memc=newmemcached(『ocs』);//這裡的ocs,就是persistent_id
if(count($memc->getserverlist())==0)/*建立連線前,先判斷*/
echo"new connection"."
";/*所有option都要放在判斷裡面,因為有的option會導致重連,讓長連線變短連線!*/
$memc->setoption(memcached::opt_compression,false);
$memc->setoption(memcached::opt_binary_protocol,true);
$memc->setoption(memcached::opt_tcp_nodelay,true);//重要,php memcached有個bug,當get的值不存在,有固定40ms延遲,開啟這個引數,可以避免這個bug
/* addserver **必須在判斷裡面,否則相當於重複建立』ocs』這個連線池,可能會導致客戶端php程式異常*/
$memc->addserver("your_ip",11212);
$memc->setsaslauthdata("user","password");
else
echo"now connections is:".count($memc->getserverlist())."
";$memc->set("key","value");
echo"get from ocs: ".$memc->get("key");
//$memc->quit();/***結束的地方一定不能加quit,否則變短連線!*/
上述**要特別注意的三個地方都加了注釋。建構函式裡的「ocs」關鍵字,就相當於乙個連線池了,需要使用的連線呼叫 new memcached(『ocs』) 就能從池裡獲取連線。
執行結果
將上述**放到 apache 工作路徑/var/www/html/下面,命名為 test.php。然後再瀏覽器輸入: http://your_ip:80/test.php 。前8次瀏覽器都輸出結果為:
newconnection
getfromocs:value
即這8次都是新建連線,而8次後都是復用這8個鏈結了。抓包結果也顯示8次後都是長連線,無 socket 重連無鑑權。
#startservers:numbers of server processes to start
startservers8
於是剛好在『ocs』這個 persistent_id 的連線池裡面初始化8個連線,此後的請求就用這8個鏈結了。
接下來測試頁面跳轉,拷貝乙個 php 檔案,建立連線的建構函式的 persistent_id 還是用 「ocs」。得到的結果是從乙個連線換到了另乙個連線上(因為呼叫的 apache 子程序不一樣),但無鑑權無 socket 重連過程。即 php memcached 的長連線設定是有效的。通常我們使用的都是 php-fpm 模式, fpm 程序會和 memcached server 保持長連線,因此該連線的生命週期同 apache 程序。
mysql 長連線 心跳 使用mysql的長連線
有個資料看得我雲裡霧裡的。現在用自己的言語來總結一下,寫文字,能夠加深自己的理解。也會在寫的過程中幫助自己發現理解方面瑕疵,繼續查資料求證。長連線就可以避免每次請求都建立連線的開銷,節省了時間和io消耗。長連線是提高了效能。不過還有一些細節的問題需要解決,即mysql發現乙個鏈結長時間沒有執行查詢請...
PHP長連線實現
每次我們訪問php指令碼的時候,都是當所有的php指令碼執行完成後,我們才得到返回結果。如果我們需要乙個指令碼持續的執行,那麼我們就要通過php長連線的方式,來達到執行目的。每個php指令碼都限制了執行時間,所以我們需要通過 set time limit 來設定乙個指令碼的執行時間為無限長 然後使用...
長連線(輪詢,心跳,socket)
概念 表示客戶端和伺服器端保持聯絡,客戶端向伺服器端一直獲取資料,或者是伺服器端一直向客戶端推送資料。基本的長連線方式 輪詢表示客服端利用定時器原理 setinterval 間隔時間內向伺服器請求最新資料。心跳原理跟輪詢類似,但是心跳在一段時間內沒有向到伺服器請求,就會認為客戶端狀態異常。socke...