[PHP] socket客户端时的超时问题
连接socket分为连接超时和读取超时
$sock=stream_socket_client("www.google.com:80", $errno,$errstr,2); 那个数字是连接超时 ,比如连接google , 2秒就返回错误 , 这样就不会一直等在那了
stream_set_timeout($sock,5); 这个数字是读取数据的超时
stream_get_meta_data 可以在socket中返回元数据
比如下面的测试,因为http协议连接完就会被服务端断掉,所以没办法使用长连接一直传输数据,需要在循环中不停的new对象创建连接
for($i=0;$i<1000;$i++){ $sock=stream_socket_client("www.baidu.com:80", $errno,$errstr,2); stream_set_timeout($sock,5); $meta=stream_get_meta_data($sock); var_dump("start",$meta); fwrite($sock, "GET / HTTP/1.0\r\n\r\n"); $buf = ''; while (true) { $s = fread($sock,1024); if (!isset($s[0])) { break; } $buf .= $s; } $meta=stream_get_meta_data($sock); var_dump("end",$meta,$sock); }
string(5) "start" array(7) { ["stream_type"]=> string(14) "tcp_socket/ssl" ["mode"]=> string(2) "r+" ["unread_bytes"]=> int(0) ["seekable"]=> bool(false) ["timed_out"]=> bool(false) ["blocked"]=> bool(true) ["eof"]=> bool(false) } string(3) "end" array(7) { ["stream_type"]=> string(14) "tcp_socket/ssl" ["mode"]=> string(2) "r+" ["unread_bytes"]=> int(0) ["seekable"]=> bool(false) ["timed_out"]=> bool(false) ["blocked"]=> bool(true) ["eof"]=> bool(true) } resource(175) of type (stream)
其中的timed_out就是读取数据的超时,false为读取没超时
eof为是否已经到了文件尾,如果是长连接这里是不会到达文件尾的,http协议这种短连接会读完后连接就结束了
十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》
一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网