如何解决[警告: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(连接超 时)

无法在 PHP 中与 fsockopen 连接(连接超时)

在 Codeigniter 中无法发送电子邮件 - fsockopen():无法连接到 ssl://smtp.gmail.com:465(连接被拒绝)

如何使用 fsockopen() 使用密码打开 Telnet 连接?

使用 fsockopen 的警报握手失败 paypal IPN 集成

PHP fsockopen受服务器KeepAlive影响的解决