fsockopen()无法在特定的Web主机上运行?

时间:2011-11-08 08:14:24

标签: php apache cpanel fsockopen connection-timeout

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

我的第一个想法是他将它用作TCP并使用IP /端口作为游戏服务器,但他和我都证实该脚本在各种其他网络主机上运行良好。

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

作品: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';
        }
    }

2 个答案:

答案 0 :(得分:4)

托管公司可能已在您尝试测试的任何端口上禁用了fsockopen功能或防火墙出站请求。如果是这种情况,您可以要求他们重新启用该功能或​​取消阻止端口,但如果他们不这样做,那么除了转移到新主机之外,您几乎没有任何追索权。

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

答案 1 :(得分:4)

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

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

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

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