PHP TCP長連接擴展:foolsock
foolsock 是為了實現 RPC 通信中 TCP 長連接而開發的 PHP 擴展
簡介
PHP 很多項目隨著業務規模的增長(尤其是終端眾多的情況下)逐漸向服務化演變,常見的一種架構模型是將相對獨立或者比較耗時的業務抽象為單獨的服 務(如用戶模塊)使用c/c++、golang等更高效的語言處理,具體的業務層(如:網頁端、移動端)來調用各個服務,這種架構大大降低了各業務之間的 耦合度,同時最大限度的提高了模塊的重用性。
業務層與后端的服務之間的通信協議中,http并不是一種高效的rpc協議。事實上php中有眾多的擴展可以為我們提供很好的范例,如:mysql、memcached等等都是最常見不過的"服務"了,我們完全可以采用它們的客戶端處理方式。
mysql、memcached這些擴展都是采用TCP與服務端進行通信,你肯定記得他們都有長連接的連接方式,有興趣的同學可以去翻一下它們的源碼。
如果像mysql、memcached那樣將協議的處理也封裝在php擴展中,那么意味著每增加一個服務我們都需要安裝一個擴展,這樣將很不利于維護,同時也會降低開發效率。
foolsock對socket進行了一層簡單的封裝,將連接放在persistent_list哈希表中,每個fastcgi進程連接后不會被釋放,下次請求時直接使用。目前最大的連接數等于fastcgi進程數,當然你也可以自行修改下實現連接池的效果。
使用foolsock可以將協議相關的邏輯也使用php實現,可以大大降低開發成本,foolsock/example/memcache_client.php提供了一個簡單的memcache客戶端的示例。
安裝
從github下載源碼后解壓 cd foolsock phpize ./configure make && make install 最后將extension=foolsock.so加入php.ini,重啟php-fpm或者其他fastcgi
使用
<?php $sock = new FoolSock(string $host,int $port); //connect $r = $sock->pconnect([ int $timeoutms ]); //超時時間,單位:毫秒 if(false === $r){ exit(); } //write $sock->write(string $msg);//返回false時可以調用$sock->pclose()關閉再重連$sock->pconnect() //read $sock0->read(int $read_buf_size); //超時時間大于0時如果read無數據返回此操作將會阻塞直至超時
示例
example/memcache_client.php提供了一個簡單的memcache客戶端的例子(使用memcache二進制協議),實現memcache兩個基本操作:Add/Get,經過測試處理效率與使用memcache擴展相當。