1

我正在尝试使用 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){
        // ...
}

我已经尝试过 try/catch,我已经尝试向异常添加自定义处理程序。我唯一的想法是在 Web 请求之外运行它并存储响应,以便 Web 请求不会启动它。

有什么想法吗?

4

2 回答 2

2

首先,我将在 fsockopen 调用的任一侧添加几个 echo 命令:

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");
    ...

PS如果添加这两个命令可以解决问题,然后尝试看看其中一个是否可以解决问题。这将提供一个很大的线索,真正的问题是什么。

于 2012-05-07T23:08:47.527 回答
0

似乎通过将逻辑移到 html 生成之外是有效的。查找发生在任何 html 呈现之前,因此如果它失败,它不会中断 html 输出。

于 2012-05-07T23:29:41.297 回答