3

我们的一位客户说他们有一个非常简单的脚本,它使用 fsockopen() 来确定服务器是否在线。他们说直到最近它通过我们在他们的网站上运行良好,但最近刚刚停止工作,所以我假设这是一个设置。

我的第一个想法是他将其用作 TCP 并将 IP/端口用于游戏服务器,但是他和我自己都确认该脚本在其他各种 Web 主机上运行良好。

特别是我们的问题可能是什么?

作品:http ://crazygfl.xfactorservers.com/query.php?ip=www.xfactorservers.com&port=80

作品:http ://crazygfl-stats.com/query.php?ip=109.73.163.231&port=27015

不起作用:http ://crazygfl.xfactorservers.com/query.php?ip=109.73.163.231&port=27015

这是代码...

<?php

    $timeout = (isset($_GET['timeout']) ? ($_GET['timeout'] <= 0 ? 30 : ((int)$_GET['timeout'])) : 30);

    if(empty($_GET['ip'])&&empty($_GET['port'])){
        echo 'No IP/Port specified.';
    }else{
        if(fsockopen($_GET['ip'], $_GET['port'], $errno, $errstr, $timeout) === false){
            echo 'offline';
        }else{
            echo 'online';
        }
    }
4

2 回答 2

4

托管公司可能已禁用 fsockopen 功能或在您尝试测试的任何端口上对出站请求进行了防火墙保护。如果是这种情况,您可以要求他们重新启用该功能或​​解除对端口的阻塞,但如果他们不这样做,那么除了移动到新主机之外,您几乎没有其他办法。

顺便说一句,直接使用来自用户输入的数据($_GET、$_POST 等)而不进行任何验证是一个非常糟糕的主意!

于 2011-11-08T08:39:00.387 回答
4

您上面引用的三台主机是在同一台机器上,还是在不同的机器上?可能是它们之间的配置不一致。检查是否启用了“fsockopen”:

 <?php
 if(function_exists('fsockopen')) {
      echo "fsockopen function is enabled";
 }
 else {
      echo "fsockopen is not enabled";
 }
 ?>

如果已启用,请检查防火墙规则是否阻止不成功的主机。

如果失败,请将您的脚本迁移到基于 cURL 的实现: http ://ch.php.net/curl,看看这是否有助于解决问题。

于 2011-11-08T08:50:35.553 回答