我最近一直致力于使用 PHP 构建 TCP 服务器(我知道开始时的选择是错误的,但这是工作标准),所以我已经达到了一个可靠的原型(prototype)来对其进行测试的地步显示出良好的效果。一开始我使用套接字函数来处理服务器连接,它运行良好,但该项目的主要任务之一是确保 channel 安全,因此我切换到 stream_socket。
我想要的是 stream_socket 组中的 socket_last_error 等效项,这样我就可以知道与客户端的连接何时关闭。当前情况下,即使客户端已经关闭,所有进程都将等待超时计时器释放。
我在网上搜索了一下,发现无法通过 PHP 解决这个问题,而且我发现有些人打开了关于它的问题单,要求 socket_last_error 等效于流。 https://bugs.php.net/bug.php?id=34380
那么无论如何都知道何时发出 FIN_WAIT 信号?
谢谢,
最佳答案
stream_socket
家族我觉得不太可能,看起来级别太高了。
我尝试了一个非常 hackish 的解决方案,我不知道它是否适合你,它不是很可靠:
<?php
set_error_handler('my_error_handler');
function my_error_handler($no,$str,$file,$line) {
throw new ErrorException($str,$no,0,$file,$line);
}
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)\n";
} else {
while ($conn = stream_socket_accept($socket)) {
foreach (str_split('The local time is ' . date('n/j/Y g:i a') . "\n") as $char) {
echo $char;
try {
fwrite($conn,$char);
} catch (ErrorException $e) {
if (preg_match("/^fwrite\(\): send of 1 bytes failed with errno=([0-9]+) ([A-Za-z \/]+)$/",$e->getMessage(), $matches)) {
list($errno,$errstr) = array((int) $matches[1], $matches[2]);
if ($errno === 32) {
echo "\n[ERROR] $errstr"; // Broken pipe
}
}
echo "\n[ERROR] Couldn't write more on $conn";
break;
}
fflush($conn);
}
fclose($conn);
}
fclose($socket);
}
echo "\n";
?>
启动:php ./server.php
连接:nc localhost 8000 |头-c1
服务器输出:
The loca
[ERROR] Broken pipe
[ERROR] Couldn't write more on Resource id #6
关于php - 如何知道连接何时被 peer 在 php 中重置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953336/