PHP Server Socket在看似随机的实例中关闭

时间:2018-02-03 05:42:03

标签: php sockets

我有一台在线服务器,我编写了一个PHP代码来充当Socket服务器来处理消息。消息来自连接到IP和端口并发送消息的设备。

我发现this code example允许我同时处理多个连接,并在邮件进入时对其进行管理。

我修改了代码以正确解析来自设备的消息。

测试期间一切进展顺利。但是,当我们进行扩展测试时,PHP套接字服务器会在看似随机的时间关闭,并会出错:

socket_read() failed: reason: Connection reset by Peer at line 104. 

查看我正在运行的代码,这是第104行的代码块,它从if条件开始。

if (false === ($buf = socket_read($client, 115200, PHP_BINARY_READ))) {
    echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($client)) . "\n";
    $GLOBALS['mysqli']->close();
    break 2;
}

我实际上不确定如何理解这个错误信息。在我们的测试期间,有时在设备发送消息时该错误会显示并关闭套接字服务器 - 但我们确信设备没有发送Socket Shutdown命令。在其他时候,当我们让套接字服务器刚刚运行时,会出现该错误。

有谁知道如何有效地阻止PHP套接字服务器关闭并继续运行?

我知道我可以运行一个cronjob,定期检查是否正在使用套接字。但是,当套接字服务器意外关闭时,PHP代码无法执行,因为它仍然会读取端口仍在使用中,即使先前的套接字服务器实例已经关闭且我们无法再连接到它。需要很长时间才能让cronjob再次设置套接字并接受消息 - 我们需要套接字服务器几乎一直运行。

1 个答案:

答案 0 :(得分:1)

“Peer连接重置”表示客户端意外断开连接。例如,用户可能在完成与服务器通信之前关闭了客户端。

您的服务器代码需要准备好处理客户端套接字上的错误,而不是在客户端套接字上出现错误时退出。当您从客户端套接字收到错误时,只需断开该客户端即可。