php - 如何知道连接何时被 peer 在 php 中重置?

标签 php tcp timeout connection-close

我最近一直致力于使用 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/

相关文章:

php - Mysql join 用于以下ER

c# - 通过网络发送 C# 程序集/DLL?

tcp - 原始 tcp 发送和接收

asynchronous - 为什么 Future.timeout 在 dart 中不起作用?

c# - 异步任务超时

php - 获取最新的新闻发布数据库

php - 从远程服务器执行 php 中的 Node 脚本

ruby-on-rails - 为 Rails 中的 Postgres 查询临时增加 'statement_timeout'?

PHP - 检查数组中的重复项并更新循环中的重复值

flash - Actionscript TCP 套接字无法为某些人发送消息