php socket 服务端php进程终止后,客户端php进程 socket_read(获取 socket_write) 报错

灰色v碰触
  • 2.8k

php socket 服务端php进程终止后,客户端php进程 socket_read(获取 socket_write) 报错

客户端 php 有没有什么办法检测服务端 php进程是否已经终止??

实际要解决的问题是 如何防止服务端 php 进程终止后客户端 php 在 socket_read/socket_write 弹出错误信息 ??

错误信息如下如下:

clipboard.png


补充下:不要类似使用 @error_reporting 屏蔽警告信息答案(之前没说清楚,汗),请提供其他解决方法,3q

回复
阅读 3.5k
2 个回答

设置php的警告等级,忽略waring
在文件开头加上

ini_set("error_reporting","E_ALL & ~E_NOTICE");

更新2017年10月17日10:52:20

$buff=socket_read($socket,1024,PHP_NORMAL_READ);

修改为

$buff=socket_read($socket,1024,PHP_BINARY_READ);

因为如果读的模式为PHP_NORMAL_READ,那么返回的结果中如果没有 n或者r之类的标记的话,就会出warning
当服务端断开客户端的时候,socket_read()读取不到n或者r结尾的内容,实际上这个函数返回false,所有就出warning

Aspiror
  • 4
新手上路,请多包涵

首先如果服务器端socket已经关闭了的话,client将无法connect成功到Server的port上(报错10061);

10061错误是指没有启动服务器或者说服务器没有处于监听状态.

其次一般来说,socket中客户端都是先进行write,再进行read/recv的。这样的话,write函数报错就直接退出好了。

可以写个脚本验证一下

    <?php                         //socket-client
    set_time_limit(0);
    $hostip = "xxx.xxx.xx.xxx";   //用另一公网ip
    $port = 23333;                //1~65535,取大一点以防端口被占用
    //1.create
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    //2.connection
    $connection = socket_connect($socket, $hostip, $port);
    if($connection===FALSE){
        socket_close($socket);
        die("connect failed");
    }else{echo"connect OK.";}
    socket_close($socket);
    ?>

服务器端($hostip对应的主机)不运行对应的程序(但是要记得启动服务器并允许外部ip入站访问!):

设置允许访问:

  1. 关闭防火墙功能
  2. Apache设置httpd.conf中访问权限为“Require All”。这里我用的wamp3.1.0,只需要切换到服务器在线状态,修改httpd-vhosts.cof中的参数就可以了。

结果运行client.php仍然报错:
Warning: socket_connect(): unable to connect [10061]

综上所述,不需要考虑客户端的read/write问题,只需要考虑connect的成功与否就能够判断服务器是不是出现了 问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏