1
我想设置一个超时在我的PHP函数下面,以避免页面加载需要一段时间,但我需要发送一个TCP消息通过PHP的页面加载一个IP和端口,如何设置一个超时事件该IP和端口无法访问?PHP设置套接字超时不起作用?
我已经尝试使用下面的socket_set_option方法,但不幸的是它将需要长达30秒,有时更长。
我在laravel 5.2项目
public static function send($command, $data = '')
{
$MUSdata = $command . chr(1) . $data;
$socket = \socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
$connect_timeval = array(
"sec"=>0,
"usec" => 100
);
\socket_set_option(
$socket,
SOL_SOCKET,
SO_SNDTIMEO,
$connect_timeval
);
\socket_connect($socket, Config::get('frontend.client_host_ip'), Config::get('frontend.mus_host_port'));
\socket_send($socket, $MUSdata, strlen($MUSdata), MSG_DONTROUTE);
\socket_close($socket);
}
不幸的是,'SO_SNDTIMEO'不影响连接超时;只有在套接字连接后才执行写入操作。您需要将套接字置于非阻塞模式,为连接编写自己的超时循环(这将返回EAGAIN,直到套接字连接),然后将套接字重新置于阻塞模式。我会发布这个答案,但我不确定如果PHP支持的话。 –