0

我有这个 PHP 代码:

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

'60' 是连接超时。在那一行之后,我有:

if (!$fp) {...}

现在:在执行大括号内的代码之前,这条线会等待超时时间吗?

4

1 回答 1

2

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

  • 连接成功(返回一个套接字)
  • 连接显式失败 - IE 连接被服务器拒绝或重置
  • 连接隐式失败 - IE 超时

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

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

我建议你降低这个超时时间——60 秒太长了。

编辑

1实际上,您可以STREAM_CLIENT_ASYNC_CONNECT通过stream_socket_client(). 使用此标志时,必须使用stream_select()来确定套接字是否/何时连接。

于 2011-12-23T14:03:59.350 回答