- 論壇徽章:
- 0
|
博客地址: http://lajabs.net/?p=373
php做為腳本語言,有時也有特殊的需求對外連接到其它服務(wù)器發(fā)送消息,簡單的方法可以直接使用socket擴展,比如連接一個TCP服務(wù)器:
- $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
- if($socket)
- {
- socket_connect($socket, '127.0.0.1', 8081);
- $pack = 'hello.'; //發(fā)送的內(nèi)容
- socket_send($socket, $pack, strlen($pack), 0);
- socket_recv($socket, $buffer, 1024, 0);
- echo $buffer; //接收的內(nèi)容
- }
復(fù)制代碼 這些socket功能已經(jīng)可以滿足大多數(shù)對外連接的需要了,但面對一些連接特別頻繁的環(huán)境就顯得有些力不從心,系統(tǒng)頻繁地建立和銷毀連接的開銷是很大的,這時需要一種持久連接,說到持久連接,很多人可能會馬上想到mysql_pconnect這類函數(shù)(有點談虎色變),由于PHP的運行機制造成持久連接一直有著這樣那樣的問題(不細(xì)談),其實對于目前高版本的PHP,啟用php-fpm運行在fast-cgi下
的持久連接使用還是比較理想的。
php很早就提供了一個這樣的函數(shù):pfsockopen,可能更多人對于fsockopen更了解,而使用上則大同小異。
簡單地用例子說明:
- $socket = pfsockopen('127.0.0.1',8081,$errno, $errstr);
- if($socket)
- {
- $pack = 'hello.';
- fwrite($socket, $pack); //fput 、fget
- $buffer = fread($socket, 1024);
- echo $buffer;
- }
復(fù)制代碼 php建立了一個和目標(biāo)服務(wù)器8081端口連接,當(dāng)PHP腳本執(zhí)行完成后不會斷開連接,并在下一次腳本運行時重新使用這個連接,
使用php-fpm環(huán)境下會建立與其進程數(shù)相同的連接數(shù),這樣就類似形成一個“連接池”。 |
|