PHP5 fsockopen 连接错误中断站点,无论我如何捕获它


PHP5 fsockopen connection error break site, no matter how I capture it

我正在尝试使用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 输出。