228
iPhone_iPad_Mac_手機_平板_蘋果apple
利用PHP長連接提高性能__最佳實踐_雲數據庫 Memcache 版-阿裏雲
利用PHP長連接提高使用雲數據庫Memcache 版的性能
問題介紹
最近有 PHP 用戶反饋對雲數據庫 Memcache 版做性能測試的結果,達不到預期的性能指標。通過了解具體情況,大多數用戶在使用 PHP 連接雲數據庫 Memcache 版時,都是通過走 Apache WEB 服務再連雲數據庫 Memcache 版,使用的是短連接。而每個短連接的開銷不止是 socket 重連,還有複雜的重新鑒權流程,開銷比一個普通請求大許多,因此對網站的效率是有很大影響的。
解決方案
於是我們建議用戶改短連接為長連接,但是雲數據庫Memcache要求使用的PHP MEMCACHED擴展,不像memcache擴展那樣有個pconnect接口。如何才能在PHP中建立長連接,以下教程供大家參考。
在PHP 官網介紹 memcached 構造函數時有下麵一段話:
說明
Memcached::__construct ([ string $persistent_id ] )創建一個代表到Memcached服務端連接的Memcached實例。
參數
persistent_id默認情況下,Memcached實例在請求結束後會被銷毀。但可以在創建時通過persistent_id為每個實例指定唯一的ID, 在請求間共享實例。所有通過相同的persistent_id值創建的實例共享同一個連接。
即在調用構造函數時傳給它一個同樣的 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);
$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())."<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次瀏覽器都輸出結果為:
New connection
Get from OCS: value
即這8次都是新建連接,而8次後都是複用這8個鏈接了。抓包結果也顯示8次後都是長連接,無 socket 重連無鑒權。
那麼為什麼有8個鏈接? 通過查看 httpd.conf 配置文件,是因為 appache 啟動了8個子進程:
#StartServers:numbers of server processes to start
StartServers 8
於是剛好在‘ocs’這個 persistent_id 的連接池裏麵初始化8個連接,此後的請求就用這8個鏈接了。
接下來測試頁麵跳轉,拷貝一個 php 文件,建立連接的構造函數的 persistent_id 還是用 “ocs”。得到的結果是從一個連接換到了另一個連接上(因為調用的 Apache 子進程不一樣),但無鑒權無 socket 重連過程。即 PHP memcached 的長連接設置是有效的。通常我們使用的都是 PHP-FPM 模式, FPM 進程會和 memcached server 保持長連接,因此該連接的生命周期同 Apache 進程。
最後更新:2016-12-21 11:29:27
上一篇:
緩存 PHP session 變量__最佳實踐_雲數據庫 Memcache 版-阿裏雲
下一篇:
緩存Tomcat session變量__最佳實踐_雲數據庫 Memcache 版-阿裏雲
命令終端的使用方法__命令終端_用戶指南(Linux)_數據管理-阿裏雲
數據類型支持情況__進階與深入_數據集成-阿裏雲
CreateLogstore__日誌庫相關接口_API-Reference_日誌服務-阿裏雲
通信連接配置__SDK參考手冊_數據集成-阿裏雲
物聯網即將顛覆生活?阿裏雲IoT開啟智能家居新時代
查看實例列表__實例管理_開放API_分布式關係型數據庫 DRDS-阿裏雲
發票管理__管理後台_服務商_雲市場-阿裏雲
1.4 導入數據__快速入門_分析型數據庫-阿裏雲
地鐵站點_阿裏雲幫助中心-阿裏雲,領先的雲計算服務提供商
性能測試核心技術__中級課程_性能測試視頻教程_性能測試-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲