我有这个PHP代码:
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
'60'是连接的超时。 就在那条线之后,我有:
if (!$fp) {...}
现在:在执行大括号内的代码之前,此行是否会等待超时时间?
答案 0 :(得分:2)
大括号内的代码将在调用stream_socket_client()
后返回。它将以三种方式之一返回:
前两个选项最多可能在几秒钟内发生 - 可以合理地假设,如果您在10秒内未建立连接,则无法正常工作。使用当前代码,第三个选项将不会发生60秒,这意味着您可能会在执行该代码之前等待60秒。
这几乎适用于PHP中的每个函数 - 您必须等待一个函数完成执行才能执行下一个函数。这条规则有一些例外 - 其中许多例外都存在于套接字编程领域,这些被称为“非阻塞”操作 - 但是在连接之前你不能将套接字设置为非阻塞撞击> 1 。这意味着你的连接调用将一直“阻塞”,直到它连接或失败 - 你的大括号内的代码永远不会被执行,直到套接字连接失败,这可能需要60秒。
我建议你降低这个超时 - 60秒是不必要的长。
修改的
1 事实上,您可以通过STREAM_CLIENT_ASYNC_CONNECT
的{{1}}标志以非阻塞方式执行连接操作。使用此标志时,必须使用stream_socket_client()
来确定是否/何时连接套接字。