php socket非阻塞,php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()...
stream_set_blocking函數(shù)可以將資源流設置為阻塞模式或者非阻塞模式,主要影響的函數(shù)分別是fgets,fread,其他的手冊沒有說。
在socket編程中,如果一個socket連接上了,但是不發(fā)送數(shù)據(jù),此時使用fread或者fgets去讀取數(shù)據(jù),由于socket句柄是有效的,但是獲取不到數(shù)據(jù),fread/fgets就會阻塞等待卡在那里,一直等到超時才繼續(xù)向下執(zhí)行。
看下面的阻塞等待demo:
服務器:<?php
$socket?=?stream_socket_server('tcp://127.0.0.1:8888',?$errno,?$errstr);
while?($conn?=?stream_socket_accept($socket))
{
//服務端知道客戶端連接了,就是不給你發(fā)消息,先睡一會兒吧
sleep(1000);
}
fclose($socket);
客戶端:<?php
$socket?=?stream_socket_client('tcp://127.0.0.1:8888',?$errorno,?$errstr);
echo?'start';
echo?fread($socket,?128);
echo?'success';
fclose($socket);
由于服務器端不發(fā)送任何東西,fread一直卡住,阻塞等待,此時程序只輸出start,一直到超時后才輸出success。另外需要注意的是阻塞等待過程中如果對應的socket被關閉了也不會繼續(xù)阻塞,例如上面的服務器端被關閉了。
再看下面的非阻塞等待demo:
客戶端:<?php
$socket?=?stream_socket_client('tcp://127.0.0.1:8888',?$errorno,?$errstr);
stream_set_blocking($socket,false);
echo?'start';
echo?fread($socket,?128);
echo?'success';
fclose($socket);
非阻塞等待的比較簡單,我去獲取數(shù)據(jù),沒有就算了直接返回,根本不去等你給我發(fā)。
總結
以上是生活随笔為你收集整理的php socket非阻塞,php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 画布插入图像,javascrip
- 下一篇: php mysql 数据回滚,PHP m