【问题标题】:How to properly check if a client disconnected from PHP socket?如何正确检查客户端是否与 PHP 套接字断开连接?
【发布时间】:2021-05-11 09:59:59
【问题描述】:

好的,所以断开连接的客户端由 PHP 中的 socket_select() 返回。但是如何检查客户端是否与 PHP 套接字断开连接而不产生 PHP 警告?

我发现的大多数线程都建议使用 socket_read() 如果客户端断开连接,它将返回 false。但这会产生以下警告:

PHP Warning:  socket_read(): unable to read from socket [10053]:

我尝试了以下代码:

    // ...

    if (!$connections = $this->_connections) continue;
    if (!socket_select($connections, $null, $null, 0, 100)) continue;
    
    foreach ($connections as $connection) {

      // check for incoming data
      if ($buffer = socket_read($connection, 1024, PHP_NORMAL_READ)) {

        // ...

      } else if ($buffer === false) {
        if ($i = array_search($connection, $this->_connections)) {
          socket_shutdown($this->_connections[$i]);
          socket_close($this->_connections[$i]);
          unset($this->_connections[$i]);
        }
      }

    // ...

我不认为用 @ 抑制警告是一个值得信赖的解决方案。

https://www.php.net/manual/en/ref.sockets.php

编辑:似乎我在客户端断开连接时从 socket_read() 接收到一些字节数据。我正在使用 Sec-WebSocket-Key 这可能是为什么?字符串(8) "]!^"

【问题讨论】:

    标签: php sockets


    【解决方案1】:

    当您到达数据末尾时,socket_read() 返回一个空字符串。所以除了FALSE之外,还要检查一下。

    您可以简单地使用else,因为false"" 都是假的。

        foreach ($connections as connection) {
    
          // check for incoming data
          if ($buffer = socket_read($connection, 1024, PHP_NORMAL_READ)) {
    
            // ...
    
          } else {
            if ($i = array_search($connection, $this->_connections)) {
              socket_shutdown($this->_connections[$i]);
              socket_close($this->_connections[$i]);
              unset($this->_connections[$i]);
            }
          }
    

    【讨论】:

    • 我认为您没有理解我的问题。 socket_read() 返回警告:无法从套接字读取。我使用 false,因为我不想仅通过返回的空字符串来删除打开的连接。哦,您的 $i 索引是 socket_select() 的数组键,它们与 $this->_connections 中的不同。
    • 如果套接字处于阻塞模式,则在连接仍处于打开状态时不应返回空字符串。
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多