【发布时间】:2014-05-18 02:53:00
【问题描述】:
如果之前有人问过这个问题,我很抱歉。我到处寻找,但找不到任何解决我的问题的方法。
我已经为我的一个项目编写了一个套接字客户端函数,我想给它添加一个超时,这样如果它失败就不会永远加载。
我已经尝试了很多文档和 StackOverflow 上的其他答案所建议的东西,但到目前为止没有任何效果。
这是我的功能;
public function send($cmd, $host, $port){
if(!($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Error (#300)");
}
if(!socket_connect($socket, $host, $port))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Error (#400)");
}
if(!socket_write($socket, $cmd, strlen($cmd)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Error (#301)");
}
$reply = socket_read($socket, 4096)
or die("Error (#302)");
socket_close($socket);
return $reply;
}
我尝试了以下方法;
-
set_time_limit()- 不起作用。加载需要 20 秒,但显示“...的最大执行时间” -
ini_set("default_socket_timeout")- 仍然需要 20 秒才能加载。 -
socket_set_nonblock()- 这可行,但会使socket_connect()失败。 -
https://stackoverflow.com/a/16939666/3457242 - 同上。
socket_set_nonblock()使socket_connect()失败。 -
socket_set_option()- 加载需要 20 秒。好像不行。
似乎唯一有效的是socket_set_nonblock() 函数,但它总是使socket_connect() 返回false。我就是想不通。任何帮助将不胜感激。
谢谢!
【问题讨论】:
标签: php sockets timeout client