Php fsockopen()在特定的web主机上不工作?
我们的一位客户说,他们有一个非常简单的脚本,它使用fsockopen()来确定服务器是否在线。他们说,直到最近,它通过我们在他们的网站上运行良好,但最近刚刚停止工作,所以我假设这是一个设置 我的第一个想法是,他将其用作TCP,并将IP/端口用于游戏服务器,但他和我都确认,该脚本在其他各种web主机上运行良好 特别是我们的问题是什么 作品: 作品: 不起作用: 这是代码Php fsockopen()在特定的web主机上不工作?,php,apache,cpanel,fsockopen,connection-timeout,Php,Apache,Cpanel,Fsockopen,Connection Timeout,我们的一位客户说,他们有一个非常简单的脚本,它使用fsockopen()来确定服务器是否在线。他们说,直到最近,它通过我们在他们的网站上运行良好,但最近刚刚停止工作,所以我假设这是一个设置 我的第一个想法是,他将其用作TCP,并将IP/端口用于游戏服务器,但他和我都确认,该脚本在其他各种web主机上运行良好 特别是我们的问题是什么 作品: 作品: 不起作用: 这是代码 <?php $timeout = (isset($_GET['timeout']) ? ($_GET['time
<?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';
}
}
托管公司可能已在您尝试测试的任何端口上禁用fsockopen功能或防火墙出站请求。如果是这种情况,您可以要求他们重新启用该功能或取消阻止该端口,但如果他们不这样做,则除了移动到新主机之外,您几乎没有其他办法
顺便说一句,在没有任何验证的情况下直接使用来自用户输入的数据($\u GET,$\u POST,等等)是一个非常糟糕的主意 您上面引用的三台主机是在同一台机器上,还是在不同的机器上?可能是它们之间的配置不一致。检查是否启用了“fsockopen”:
<?php
if(function_exists('fsockopen')) {
echo "fsockopen function is enabled";
}
else {
echo "fsockopen is not enabled";
}
?>
如果已启用,请检查防火墙规则是否正在阻止未成功的主机
如果失败,请将脚本迁移到基于cURL的实现:并查看这是否有助于解决问题 你确定fsockopen功能没有被禁用吗?可能是一个聪明精明的人阻止了来自主机的请求,而该主机与其他主机不起作用(假设它位于不同的IP上)。这就解释了不一致的行为。你所说的“工作”/“不工作”是什么意思?它是否返回一条消息,但不是预期的消息?它没有输出吗?超时了吗?实际上我们是主持人。然而,网络托管只是我们向客户免费提供的一项附加服务,作为额外的激励。不幸的是,我们的网站管理员英语说得不是最好的,所以我最好是向他提出解决方案,而不是试图和他解决问题。由于脚本与来自我们宿主的其他端口一起工作,我倾向于后者。无法正常工作的端口是否必须通过防火墙进行隔离?@Brett Powell:是的,似乎有(或多或少)特定的规则阻止crazy----torservers.com上的脚本连接到游戏服务器。如果您输入一个Web服务器地址和端口(例如ip=www.heise.de&port=80),它工作正常。防火墙可能只允许一些标准端口(http、ftp、ssh等),或者只允许1024以下的端口或类似的端口。非常好,谢谢。对于libcurl方法来说,这样的东西不应该起作用吗?它显示仍然显示脱机使用游戏服务器端口,所以我将继续检查机器,尽管我认为防火墙已被禁用。