php socket编程中客户端异常关闭导致服务端中断的问题怎么解决
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"php socket编程中客户端异常关闭导致服务端中断的问题怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"php sock
千家信息网最后更新 2026年10月31日php socket编程中客户端异常关闭导致服务端中断的问题怎么解决
这篇文章主要讲解了"php socket编程中客户端异常关闭导致服务端中断的问题怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"php socket编程中客户端异常关闭导致服务端中断的问题怎么解决"吧!
原因如下:
1.socket_recv支持多种flag,用于不同场景
2.socket_recv可以检测socket关闭的情况(例如对端关闭了socket)
返回值:$return_value=socket_recv(...)
含义: >0 表示接收到的字节数;
===0, 发生了错误,socket closed;
===false,无数据,socket not closed。
socket_read不能判断socket是否已经断开。
测试流程:
启动server端,再启动client端:可以正常通信。
kill掉client端,结果server端只能读取到空字符串。
测试代码如下:
file: bug1_server.php
0, "usec" => 800000));socket_set_option($accept_resource, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 0, "usec" => 800000));// stream固定长度$len = 100;//让服务器不停获取客户端传过来的信息while (true) { $string_read = socket_read($accept_resource, $len); if($string_read === false) { echo "socket error:" . socket_last_error() . ",error msg:" . socket_strerror(socket_last_error()) . PHP_EOL; break; } elseif($string_read == '') { if(in_array(socket_last_error(), [SOCKET_EPIPE, SOCKET_ECONNRESET])) { echo "socket error:".socket_last_error().",error msg:".socket_strerror(socket_last_error()).PHP_EOL; break; } if(in_array(socket_last_error(), [SOCKET_EAGAIN])) { // EAGAIN, retry later usleep(500); continue; } echo "server receive empty:" . socket_last_error() . ",error msg:" . socket_strerror(socket_last_error()) . PHP_EOL;}else { $string = trim($string_read); echo 'server receive success,msg:['.$string.'],time:' . microtime(true) . PHP_EOL; }} ;// 先shutdown,后close@socket_shutdown($accept_resource);socket_close($accept_resource);@socket_shutdown($socket);socket_close($socket);/** * 生成php随机串 * @param $length * @return string */function randomkeys($length){ $output=''; for ($a = 0; $a<$length; $a++) { $output .= chr(mt_rand(33, 126)); } return $output;}?>file:bug1_client.php
0, "usec" => 800000));socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 0, "usec" => 800000));$len = 100;//连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系if (socket_connect($socket, '127.0.0.1', 8801) == false) { echo 'connect fail massege:' . socket_strerror(socket_last_error());} else { while(1){ $ori_msg = 'Hello, server!'.randomkeys(8); $message_write = str_pad($ori_msg, $len); //向服务端写入字符串信息 $sent = @socket_write($socket, $message_write, $len); if ($sent === false) { if(in_array(socket_last_error(), [SOCKET_EPIPE, SOCKET_ECONNRESET])) { echo "socket error:".socket_last_error().",error msg:".socket_strerror(socket_last_error()).PHP_EOL; break; } echo "socket error:".socket_last_error().",error msg:".socket_strerror(socket_last_error()).PHP_EOL; } else{ echo 'client write success,msg:['.$ori_msg.'],time:' . microtime(true).PHP_EOL; }// break; }}@socket_shutdown($socket);socket_close($socket);/** * 生成php随机串 * @param $length * @return string */function randomkeys($length){ $output=''; for ($a = 0; $a<$length; $a++) { $output .= chr(mt_rand(33, 126)); } return $output;}?>正确的代码是:(file: debug1_server.php)
0, "usec" => 800000));socket_set_option($accept_resource, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 0, "usec" => 800000));// stream固定长度$len = 100;//让服务器不停获取客户端传过来的信息while (true) { /* 使用socket_recv */ $len_read = socket_recv($accept_resource, $string_read, $len, 0); if ($len_read === false) { // no data echo "no data".PHP_EOL; continue; } elseif($len_read === 0 ) { // socket closed echo "socket error:" . socket_last_error() . ",error msg:" . socket_strerror(socket_last_error()) . PHP_EOL; break; } else { $string = trim($string_read); echo 'server receive success,msg:['.$string.'],time:' . microtime(true) . PHP_EOL; }} ;// 先shutdown,后close@socket_shutdown($accept_resource);socket_close($accept_resource);@socket_shutdown($socket);socket_close($socket);/** * 生成php随机串 * @param $length * @return string */function randomkeys($length){ $output=''; for ($a = 0; $a<$length; $a++) { $output .= chr(mt_rand(33, 126)); } return $output;}?>感谢各位的阅读,以上就是"php socket编程中客户端异常关闭导致服务端中断的问题怎么解决"的内容了,经过本文的学习后,相信大家对php socket编程中客户端异常关闭导致服务端中断的问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
服务
客户
客户端
问题
编程
信息
服务器
学习
生成
代码
内容
就是
情况
端的
长度
测试
不同
原因
含义
场景
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
新华互联网科技
互联网佳科技有限公司
互联网科技工作委员会毛军
中国互联网科技股
互联网科技的
万易互联网科技有限公司
奇酷互联网络科技公司
互联网女皇 腾讯科技
海南购全球互联网科技
现代科技和互联网有关系吗
互联网科技产品
北京华百购互联网科技有限公司
茂名市互联网科技产业园
崇明区互联网教育科技诚信经营
赶超互联网科技 微信多开
哈尔滨屹滨互联网科技有限公司
互联网金融科技展
中国科技创新与世界互联网大会
四川慕妮娅互联网科技有限公司
杭州披云加互联网科技有限公司
科技互联网产品
互联网通讯科技
互联网科技logo设计
伴你行互联网科技有限公司
卫星互联网科技股票
企晟互联网信息科技有限公司
杭州披云加互联网科技有限公司
广州燕处互联网科技有限公司
福仕德教育科技互联网
互联网科技的前景