foolsockPHP TCP 長(zhǎng)連接擴(kuò)展
foolsock 是為了實(shí)現(xiàn) RPC 通信中 TCP 長(zhǎng)連接而開(kāi)發(fā)的 PHP 擴(kuò)展
簡(jiǎn)介
PHP 很多項(xiàng)目隨著業(yè)務(wù)規(guī)模的增長(zhǎng)(尤其是終端眾多的情況下)逐漸向服務(wù)化演變,常見(jiàn)的一種架構(gòu)模型是將相對(duì)獨(dú)立或者比較耗時(shí)的業(yè)務(wù)抽象為單獨(dú)的服 務(wù)(如用戶模塊)使用c/c++、golang等更高效的語(yǔ)言處理,具體的業(yè)務(wù)層(如:網(wǎng)頁(yè)端、移動(dòng)端)來(lái)調(diào)用各個(gè)服務(wù),這種架構(gòu)大大降低了各業(yè)務(wù)之間的 耦合度,同時(shí)最大限度的提高了模塊的重用性。
業(yè)務(wù)層與后端的服務(wù)之間的通信協(xié)議中,http并不是一種高效的rpc協(xié)議。事實(shí)上php中有眾多的擴(kuò)展可以為我們提供很好的范例,如:mysql、memcached等等都是最常見(jiàn)不過(guò)的"服務(wù)"了,我們完全可以采用它們的客戶端處理方式。
mysql、memcached這些擴(kuò)展都是采用TCP與服務(wù)端進(jìn)行通信,你肯定記得他們都有長(zhǎng)連接的連接方式,有興趣的同學(xué)可以去翻一下它們的源碼。
如果像mysql、memcached那樣將協(xié)議的處理也封裝在php擴(kuò)展中,那么意味著每增加一個(gè)服務(wù)我們都需要安裝一個(gè)擴(kuò)展,這樣將很不利于維護(hù),同時(shí)也會(huì)降低開(kāi)發(fā)效率。
foolsock對(duì)socket進(jìn)行了一層簡(jiǎn)單的封裝,將連接放在persistent_list哈希表中,每個(gè)fastcgi進(jìn)程連接后不會(huì)被釋放,下次請(qǐng)求時(shí)直接使用。目前最大的連接數(shù)等于fastcgi進(jìn)程數(shù),當(dāng)然你也可以自行修改下實(shí)現(xiàn)連接池的效果。
使用foolsock可以將協(xié)議相關(guān)的邏輯也使用php實(shí)現(xiàn),可以大大降低開(kāi)發(fā)成本,foolsock/example/memcache_client.php提供了一個(gè)簡(jiǎn)單的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 ]); //超時(shí)時(shí)間,單位:毫秒
if(false === $r){
exit();
}
//write
$sock->write(string $msg);//返回false時(shí)可以調(diào)用$sock->pclose()關(guān)閉再重連$sock->pconnect()
//read
$sock0->read(int $read_buf_size); //超時(shí)時(shí)間大于0時(shí)如果read無(wú)數(shù)據(jù)返回此操作將會(huì)阻塞直至超時(shí)
示例
example/memcache_client.php提供了一個(gè)簡(jiǎn)單的memcache客戶端的例子(使用memcache二進(jìn)制協(xié)議),實(shí)現(xiàn)memcache兩個(gè)基本操作:Add/Get,經(jīng)過(guò)測(cè)試處理效率與使用memcache擴(kuò)展相當(dāng)
