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