如何解决[警告:fsockopen():无法连接]?
Posted
技术标签:
【中文标题】如何解决[警告:fsockopen():无法连接]?【英文标题】:How To Solve [Warning: fsockopen(): unable to connect]? 【发布时间】:2014-10-07 22:47:15 【问题描述】:我想检查我的服务器 Ubuntu Server 14.04 LTS 在我的共享托管服务器上是否在线。我的服务器有 IP 而不是域,但我的共享主机服务器有域。为此,我在共享托管服务器中使用了以下代码来检查我的服务器是否在线。
<?php
$site = "XX.XX.XX.XX";
$port = 7550;
$fp = fsockopen($site,$port,$errno,$errstr,10);
if ($fp === false)
print($errno." : ".$errstr);
if(!$fp)
echo "SERVER IS DOWN";
else
echo "SERVER IS UP ON PORT ".$port." AT ".$site;
fclose($fp);
?>
在我的共享托管服务器 php 文件中添加上述代码后,当我运行它时,出现以下错误。
Warning: fsockopen(): unable to connect to XX.XX.XX.XX:7550 (Connection timed out) in /home/USERNAME/public_html/index.php on line 4 110 : Connection timed out SERVER IS DOWN
现在有人告诉我检查allow_url_fopen = On
是否在我的共享主机服务器中打开,然后我检查了我的共享主机服务器php.ini
文件并且它已打开。
现在,当我四处寻求帮助时,其他人告诉我检查(我的共享托管服务器和我的服务器)是否有 fsockopen()
开启。然后我将下面的代码写在一个 php 文件中并在两台服务器上运行。
<?php
$fp = fsockopen ("localhost", 80, $errno, $errstr, 10);
if (!$fp)
echo "$errstr ($errno)
\n";
else
echo "fsockopen Is Working Perfectly.";
fclose ($fp);
?>
在两台服务器上运行上述 .php 文件后,我在两台服务器上得到的结果相同。
fsockopen Is Working Perfectly.
重要提示:请记住,我的服务器 IP 保持活动状态,因为我在该 IP 上使用了许多 PC,但我的服务器已关闭。我还可以使用代理在我的网络浏览器中打开http://XX.XX.XX.XX:7550
。
【问题讨论】:
Connection timed out
通常指向防火墙或来自远程端的答案,这需要太长时间。
您确定您的防火墙在目标服务器上正确转发了 tcp 端口 7550 吗?因为通常网络服务器运行在端口 80 中,如果您可以进入网站,该端口当然是开放的。
@Steini 我可以使用代理在我的网络浏览器中打开http://XX.XX.XX.XX:7550
。
@GeraldSchneider 我知道Connection timed out
的含义是什么,但我在代理上打开http://XX.XX.XX.XX:7550
然后在浏览器中打开只需1 秒。
如果您想要具有高级功能的网络通信,请使用socket_create
而不是fsockopen
。
【参考方案1】:
因为如果主机名不是有效域,fsockopen
会引发 E_WARNING
异常。因此,您使用带有 PORT offline 的 IP,然后该函数将引发异常。
您可以通过处理异常或@来解决:
$fp = @fsockopen($site,$port,$errno,$errstr,10);
如果您认为您的 PORT 在线,请检查防火墙,然后使用外部资源(如 http://www.yougetsignal.com/tools/open-ports/)进行检查。
阅读http://php.net/manual/es/function.fsockopen.php。
更新:
你可以用socket_create
测试,最好fosockopen
。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = @socket_connect($socket, 'XX.XX.XX.XX', 7550);
if( $connection )
echo 'ONLINE';
else
echo 'OFFLINE: ' . socket_strerror(socket_last_error( $socket ));
您必须设置有效的协议,请参阅:http://php.net/manual/es/function.socket-create.php。
【讨论】:
使用 @ 抑制错误消息并不能解决问题。它只是创建新的。 没有。如果您需要检查某个端口是否在 IP 中(而不是在域中)在线,您需要处理异常或使用@
。如果您处理异常,那么您将需要if
条件和try, catch
。阅读php.net/manual/es/function.fsockopen.php。 在生产环境中显示错误是不好的。
@Snake 我可以使用代理在我的网络浏览器中打开http://XX.XX.XX.XX:7550
,而且您的链接显示我的7550
端口已打开。
@Snake 当我添加$fp = @fsockopen($site,$port,$errno,$errstr,10);
然后我得到110 : Connection timed out SERVER IS DOWN
... :(
你能打开一个到其他IP或域的套接字吗?首先是识别问题。 (显然是fsockopen
)你用socket_create
测试过吗?【参考方案2】:
通常共享主机禁止除80以外的所有端口尝试使用80端口
【讨论】:
【参考方案3】:如果您使用 set set_error_handler()
覆盖错误处理程序,您需要检查 error_reporting()
是否返回 0,这意味着使用 @ 来抑制错误。
set_error_handler('errorHandler');
function errorHandler($errno, $errstr, $errfile, $errline)
if (error_reporting() === 0)
return false;
//handle error
...
【讨论】:
以上是关于如何解决[警告:fsockopen():无法连接]?的主要内容,如果未能解决你的问题,请参考以下文章
fsockopen():无法连接无法使用PHP(连接超 时)
在 Codeigniter 中无法发送电子邮件 - fsockopen():无法连接到 ssl://smtp.gmail.com:465(连接被拒绝)
如何使用 fsockopen() 使用密码打开 Telnet 连接?