PHP套接字中的错误?它不遵守超时

时间:2016-10-19 21:10:25

标签: php sockets tcp server

我启动以下服务器:

<?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存在类似的问题

为什么不起作用?

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

1 个答案:

答案 0 :(得分:1)

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

  • 您正在为读取和写入操作设置超时,但您不会在显示的代码中执行任何读取或写入操作。
  • 您正在调用超时为1的选择,一旦完成选择,您将在无限循环中再次调用它。