stream_socket_client,超时和控制

时间:2011-12-22 17:28:07

标签: php sockets timeout stream-socket-client

我有这个PHP代码:

$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);

'60'是连接的超时。 就在那条线之后,我有:

if (!$fp) {...}

现在:在执行大括号内的代码之前,此行是否会等待超时时间?

1 个答案:

答案 0 :(得分:2)

大括号内的代码将在调用stream_socket_client()后返回。它将以三种方式之一返回:

  • 连接成功(返回套接字)
  • 连接明确失败 - I.E.连接被服务器拒绝或重置
  • 连接隐式失败 - I.E.它超时

前两个选项最多可能在几秒钟内发生 - 可以合理地假设,如果您在10秒内未建立连接,则无法正常工作。使用当前代码,第三个选项将不会发生60秒,这意味着您可能会在执行该代码之前等待60秒。

这几乎适用于PHP中的每个函数 - 您必须等待一个函数完成执行才能执行下一个函数。这条规则有一些例外 - 其中许多例外都存在于套接字编程领域,这些被称为“非阻塞”操作 - 但是在连接之前你不能将套接字设置为非阻塞 1 。这意味着你的连接调用将一直“阻塞”,直到它连接或失败 - 你的大括号内的代码永远不会被执行,直到套接字连接失败,这可能需要60秒。

我建议你降低这个超时 - 60秒是不必要的长。

修改

1 事实上,您可以通过STREAM_CLIENT_ASYNC_CONNECT的{​​{1}}标志以非阻塞方式执行连接操作。使用此标志时,必须使用stream_socket_client()来确定是否/何时连接套接字。