【问题标题】:Bug in PHP sockets? It does not obey timeoutPHP 套接字中的错误?它不遵守超时
【发布时间】:2016-10-19 21:10:25
【问题描述】:

我启动以下服务器:

<?php

$socket = socket_create(AF_INET, SOCK_STREAM,  SOL_TCP);

socket_bind($socket, 'localhost', 9000) or die("Failed: socket_bind()");
socket_listen($socket, 20)              or die("Failed: socket_listen()");

$client = socket_accept($socket);

socket_set_option($client, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>1, 'usec'=>0));
socket_set_option($client, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>1, 'usec'=>0));

while(1) {
  $read = array($client);
  $write = $except = null;
  socket_select($read,$write,$except,1);
}

当我尝试使用 telnet localhost 9000 连接到此服务器时,它不会在一秒钟后退出,尽管我设置了 1 秒超时。

Linux 上的 PHP 7.0.11。 FreeBSD 上的 PHP 5.6.21 也有类似的问题

为什么它不起作用?

注意:在此示例中,我尝试减少超时。在我真正的问题中,我需要将它增加到几个小时或几天。

【问题讨论】:

标签: php sockets tcp server


【解决方案1】:

没有理由退出。据我了解您的代码:

  • 您正在设置读取和写入操作的超时时间,但您没有在所示代码中执行任何读取或写入操作。
  • 您正在以 1 的超时时间调用 select,一旦 select 完成,您将在无限循环中再次调用它。

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 2010-09-06
    • 2020-04-04
    • 2015-02-04
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2020-05-02
    • 2020-07-18
    相关资源
    最近更新 更多