【发布时间】:2017-05-08 18:07:44
【问题描述】:
我正在尝试在下面的 php 函数上设置超时以避免页面加载需要一段时间,但是我需要在页面加载时通过 php 将 tcp 消息发送到 ip 和端口,我该如何设置超时如果ip和端口不可达?
我尝试过使用下面的 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 是否支持。