利用PHP長連接提高使用OCS的效率與性能
最近有OCS的用戶反映,在使用PHP客戶端對OCS做性能測試時,測試結果達不到我們給出的性能對比報告裏的指標。通過了解客戶的具體測試情況,我們發現大多數用戶在使用PHP連OCS時,都是通過走Apache WEB服務再連到OCS,使用的是短連接。而每個短連接的開銷除了每次socket重連,還有複雜的重新鑒權流程,開銷比一個普通請求大許多,因此使用短連接在調用OCS的效率上較低,從而對網站的性能也有較大影響。於是我們建議用戶改使用短連接為使用長連接,但是OCS要求使用的PHP MEMCACHED擴展,不像memcache擴展那樣有個pconnect接口。如何才能在PHP中建立長連接,以下方法供大家參考。
在PHP官網介紹memcached構造函數時有下麵一段話:
https://php.net/manual/en/memcached.construct.php
即在調用構造函數時傳給它一個同樣的persistent_id就能實現共享連接。代碼實現如下:
<?php
$memc = new Memcached(‘ocs’);//這裏的ocs,就是persistent_id
if (count($memc->getServerList()) == 0) /*建立連接前,先判斷*/
{
echo “New connection”.”<br>”;
/*所有option都要放在判斷裏麵,因為有的option會導致重連,讓長連接變短連接!*/
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
/* addServer 代碼必須在判斷裏麵,否則相當於重複建立’ocs’這個連接池,可能會導致客戶端php程序異常*/
$memc->addServer(“your_ip”, 11212);
$memc->setSaslAuthData(“user”, “password”);
}
else
{
echo “Now connections is:”.count($memc->getServerList()).”<br>”;
}
$memc->set(“key”, “value”);
echo “Get from OCS: “.$memc->get(“key”);
//$memc->quit();/*代碼結束的地方一定不能加quit,否則變短連接!*/
?>
上述代碼要特別注意的三個地方都加了注釋。構造函數裏的‘ocs’關鍵字,就相當於一個連接池了,需要使用的連接調用new Memcached(‘ocs’)就能從池裏獲取連接。接下來看看執行結果。
將上述代碼放到Apache工作路徑/var/www/html/下麵,命名為test.php.然後再瀏覽器輸入https://your_ip:80/test.php.前8次瀏覽器都輸出結果為:
即這8次都是新建連接,而8次後都是複用這8個連接了。抓包結果也顯示8次後都是長連接,無socket重連無鑒權。那麼為什麼有8個鏈接?通過查看httpd.conf配置文件,是因為appache啟動了8個子進程。
於是剛好在‘ocs’這個persistent_id的連接池裏麵初始化8個連接,此後的請求就用這8個連接了。
接下來測試頁麵跳轉,拷貝一個php文件,建立連接的構造函數的persistent_id還是用‘ocs’。得到的結果是從一個連接換到了另一個連接上(因為調用的Apache子進程不一樣),但無鑒權無socket重連過程,即PHP memcached的長連接設置是有效的。通常我們使用的都是PHP-FPM模式, FPM進程會和memcached server保持長連接,因此該連接的生命周期同Apache進程。
(本文作者為阿裏雲OCS研發工程師 玄貝)
最後更新:2017-04-03 05:39:27