Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何解决[警告:fsockopen():无法连接]?_Php_Apache_Function_Web Hosting_Shared Hosting - Fatal编程技术网

Php 如何解决[警告:fsockopen():无法连接]?

Php 如何解决[警告:fsockopen():无法连接]?,php,apache,function,web-hosting,shared-hosting,Php,Apache,Function,Web Hosting,Shared Hosting,我想检查我的服务器Ubuntu服务器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);

我想检查我的服务器Ubuntu服务器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文件之后,我在两台服务器上得到了相同的结果

fsockopen工作正常。


重要提示:请记住,我的服务器IP保持活动状态,因为我在该IP上使用许多PC,但我的服务器已关闭。我还可以打开
http://XX.XX.XX.XX:7550
在我的Web浏览器中使用代理。

因为
fsockopen
如果主机名不是有效域,会引发
E\u警告
异常。因此,使用端口为脱机的IP时,函数会抛出异常

您可以使用handle或@解决异常:

$fp = @fsockopen($site,$port,$errno,$errstr,10);
如果您认为您的端口处于联机状态,请检查防火墙,然后与外部资源(如)进行检查

阅读

更新: 您可以使用
socket\u 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 ));
}

必须设置有效的协议,请参见:。

如果使用set
set\u error\u handler()
重写错误处理程序,则需要检查
error\u reporting()
是否返回0,这意味着使用@来抑制错误

set_error_handler('errorHandler');

function errorHandler($errno, $errstr, $errfile, $errline) {

    if (error_reporting() === 0) 
        return false;

    //handle error
    ...
}

连接超时
通常指向防火墙或来自远程端的应答,但时间太长。您确定防火墙正确转发了目标服务器上的tcp端口7550吗?因为通常Web服务器在端口80中运行,该端口是打开的,当然,若你们可以进入网站,它是打开的。@Steini我可以打开
http://XX.XX.XX.XX:7550
在我的Web浏览器中使用代理。@GeraldSchneider我知道连接超时的含义,但我打开了
http://XX.XX.XX.XX:7550
在代理上,则是在浏览器中只需1秒钟即可打开。如果您希望网络通信具有高级功能,请使用
socket\u create
而不是
fsockopen
。使用@抑制错误消息并不能解决问题。它只是创造了新的。如果需要检查某个端口是否在IP(而不是域)中联机,则需要处理异常或使用
@
。如果处理异常,则需要
If
条件和
try,catch
。阅读在生产环境中显示错误不好。@我可以打开
http://XX.XX.XX.XX:7550
在我的Web浏览器中使用代理和您的链接显示我的
7550
端口已打开。@当我添加
$fp=@fsockopen($site,$port,$errno,$errstr,10)时,Snake然后我得到
110:连接超时服务器已关闭
…:(您可以打开一个到其他IP或域的套接字吗?首先是确定问题。(显然是使用
fsockopen
)您是否使用
socket\u create
进行了测试?
set_error_handler('errorHandler');

function errorHandler($errno, $errstr, $errfile, $errline) {

    if (error_reporting() === 0) 
        return false;

    //handle error
    ...
}