Php 流\u套接字\u客户端、超时和控制

Php 流\u套接字\u客户端、超时和控制,php,sockets,timeout,stream-socket-client,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) {...} 现在:在执行大括号内的代码之前,此行是否会等待超时时间?大括号内的代码将在调用stream\u socket\u client()返回后执行。它将以三种

我有以下PHP代码:

$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
“60”是连接的超时。 就在那一行之后,我有:

if (!$fp) {...}

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

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

  • 连接成功(返回套接字)
  • 连接显式失败-即服务器拒绝或重置连接
  • 连接隐式失败,即超时
前两个选项最多可能在几秒钟内发生-可以合理地假设,如果您没有在10秒钟内建立连接,它将无法正常工作。对于您当前的代码,第三个选项在60秒内不会出现,这意味着您可能会在执行该代码之前等待60秒

这通常适用于PHP中的几乎所有函数——您必须等待一个函数完成执行,然后才能执行下一个函数。这条规则有一些例外情况——其中许多例外情况存在于套接字编程领域,这些被称为“非阻塞”操作——但在连接套接字之前,您无法将套接字设置为非阻塞1。这意味着您的connect调用将始终“阻塞”,直到它连接或失败为止—在套接字连接失败之前,括号内的代码永远无法执行,这可能需要60秒

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

编辑


1实际上,您可以通过
STREAM\u socket\u CLIENT()
STREAM\u CLIENT\u ASYNC\u connect
标志以非阻塞方式执行连接操作。使用此标志时,必须使用
stream\u select()
确定套接字是否连接/何时连接。

它将等待连接,但最多60秒