我正在尝试使用fsockopen与游戏服务器进行通信,游戏服务器会以一些基本的统计数据进行响应。当服务器处于联机状态时,它可以正常工作,但是如果服务器始终处于脱机状态,则以下代码会导致php停止显示读取数据的页面。
try {
$socket = fsockopen($host, $port, $errno, $errstr, 10);
if ($socket !== false) {
fwrite($socket, "'xFE");
$data = "";
$data = fread($socket, 1024);
fclose($socket);
if ($data !== false && substr($data, 0, 1) == "'xFF") {
// get into
} else {
// Server did not send back proper data, or reading from socket failed.
print "Server not available.";
}
} else {
// ...
}
} catch(Exception $e){
// ...
}
我已经尝试过尝试/捕获,我尝试向异常添加自定义处理程序。我唯一的想法是在 Web 请求之外运行它并存储响应,以便 Web 请求不会启动它。
有什么想法吗?
首先,我会添加几个回显命令,在 fsockopen 调用的两侧:
echo date("Y-m-d H:i:s")."Before open'n";
$socket = fsockopen($host, $port, $errno, $errstr, 10);
echo date("Y-m-d H:i:s")."After open (socket=".($socket===false?"Bad":"OK")."'n";
这是为了确认 10 秒超时正常工作。如果您从未看到第二条消息,则超时不起作用,并且问题更加模糊。
无论如何,如果您获得的是有效的$socket,但锁定发生在稍后,请尝试:
if ($socket !== false) {
stream_set_timeout($socket,2); //2 second timeout
stream_set_blocking($socket,false); //no blocking
fwrite($socket, "'xFE");
...
附言如果添加这两个命令可以解决问题,那么尝试看看是否只有一个可以解决问题。这将为真正的问题提供很大的线索。
似乎通过将逻辑移到 html 生成之外是有效的。查找发生在呈现任何 html 之前,因此如果查找失败,它不会中断 html 输出。