如何解決php使用perl-memcache時產生過多的TCP連線

最近有個系統的WEB環境升級,主要是將PHP升級到新版本。上線後,藉由網管系統的監測,發現到這些升級後的主機,他們的TCP連線數都會呈現上升、隔一段時間後下降,一直循環的狀況。

以往遇到這種狀況的經驗,都和connection pool這種架構有關。原以為是和資料庫有關,但比對該系統所使用的資料庫主機,TCP連線數卻沒有相同的趨勢。卻在memcache主機看到相同的TCP連線數趨勢。

找了專業的IT同事協助,他們在升級後的主機上執行以下指令,果然看到很多memcache的連線(ESTABLISHED)
netstat -na|grep 11211

回頭去查該系統的程式,發現該系統操作memcache時是採用Memcache,而不是慣用的Memcached。程式連memcache server方式如下…
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);

查php官方以下幾篇文章後,終於明瞭問題的原因、及解決方式

原因是 Memcache::addServer()預設是使用persistent connection。但是當我們執行 Memcache::close()時,卻不會真的關閉連線。直到web server重啟。原文說明如下…
Memcache::close() closes connection to memcached server. This function doesn't close persistent connections, which are closed only during web-server shutdown/restart. Also you can use memcache_close() function.
(實在不清楚為何pecl-memcache 對於連線是如此處理?)

解決方式,就是設定 Memcache::addServer第三個參數$persistent = FALSE。
//addServer() 參數說明
Memcache::addServer ( string $host [, int $port = 11211 [, bool $persistent [, int $weight [, int $timeout [, int $retry_interval [, bool $status [, callable $failure_callback [, int $timeoutms ]]]]]]]] ) : bool
//修改方式
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211, false);

留言