【问题标题】:Set a timeout on socket_read在 socket_read 上设置超时
【发布时间】:2010-09-28 05:26:37
【问题描述】:

我想知道如何设置socket_read 呼叫的超时时间?第一次调用socket_read,它会等到发送数据,如果5秒内没有发送数据,我想关闭连接。有什么帮助吗?我已经尝试过SO_RCVTIMEO,但没有成功。

我正在使用socket_create() 创建一个套接字并在其上侦听连接,然后在连接时侦听数据,然后对其进行处理。超时时,我想运行socket_shutdown(),然后运行socket_close()

【问题讨论】:

  • 请注意,Windows Sockets API 不适用于小于 500 毫秒的超时。您可以将超时设置为更短的时间,但是当您使用 Windows 平台时,您应该知道这可能不会像您想要的那样工作。参考:microsoft.com/mspress/books/WW/sampchap/4287d.aspx.

标签: php sockets timeout


【解决方案1】:

这设置了套接字的 5 秒超时。

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));

【讨论】:

  • 经过一些测试 - 这似乎是整个套接字的生命周期 - 不仅仅是 socket_read
  • 有趣的观察:如果你使用 PHP_NORMAL_READ 而不是 PHP_BINARY_READ(默认)作为 socket_read() 的第三个参数,它将忽略使用 socket_set_option() 设置的超时,并且会无限期地阻塞,直到发送一些东西。 .(使用 PHP 5.5.9 观察)
  • 另一个有趣的观察:如果从数组中删除`usec`,它就不起作用
  • 工作不可靠,你不能相信它。即使配置了几毫秒的超时,我也有很多情况下它会挂起几分钟。可能取决于 TCP 标志
  • 在使用socket_create() 创建的主$socket 上设置此项将影响socket_accept() 超时和socket_read() 超时。要仅影响 socket_read() 超时,请将其设置在使用 $socket_name = socket_accept() 创建的第二个套接字名称上。
【解决方案2】:

你试过socket_set_optionSO_RCVTIMEO

输入操作的超时值。

【讨论】:

  • 我试过了!我想我找到了一个使用 socket_listen 的解决方案,并使用 time()+2 和一段时间手动超时。
  • 太棒了!这为我解决了它。我现在有一个 socket_read() 对我来说超时。
【解决方案3】:

我做了一个 socket_listen,然后我用 time()+2 和一个带有非块集和 socket_read() 的 while 循环手动超时。似乎工作正常。有其他选择吗?

更新:我发现将套接字设置为非阻塞,然后使用 socket_listen 提供了我需要的超时。

【讨论】:

【解决方案4】:
$read_socket = socket_select($read, $write  = NULL, $except = NULL, 10); // 10 - Timeout
if($read_socket === FALSE)
    $this->End();
elseif($read_socket === 0)
    return FALSE;

$pdu_ = socket_read($this->session, 102400);
if($read_socket && !strlen($pdu_))
    $this->End();

【讨论】:

  • 解释一下会很有帮助。
猜你喜欢
  • 2014-08-27
  • 1970-01-01
  • 2012-02-04
  • 2021-10-04
  • 2010-12-05
  • 1970-01-01
  • 2015-10-16
  • 2010-11-19
相关资源
最近更新 更多