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 foolsockphpize./configuremake && make install最後將extension=foolsock.so加入php.ini,重啟php-fpm或者其他fastcgi
使用
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擴充相當。
項目首頁:http://www.open-open.com/lib/view/home/1441013134862