49

如何检查我是否从我的开发机器上运行的 PHP 脚本连接到互联网?

我运行脚本以使用 wget 下载一组文件(可能存在也可能不存在)。如果我在没有连接的情况下尝试下载,wget 会继续下一个,认为文件不存在。

4

13 回答 13

89
<?php
function is_connected()
{
    $connected = @fsockopen("www.example.com", 80); 
                                        //website, port  (try 80 or 443)
    if ($connected){
        $is_conn = true; //action when connected
        fclose($connected);
    }else{
        $is_conn = false; //action in connection failure
    }
    return $is_conn;

}
?>
于 2011-02-01T08:37:35.220 回答
9

您可以随时 ping 好“ol 值得信赖的谷歌”:

$response = null;
system("ping -c 1 google.com", $response);
if($response == 0)
{
    // this means you are connected
}
于 2011-02-01T08:37:04.803 回答
8

此代码在 laravel 4.2 php 框架中失败,并出现内部服务器 500 错误:

<?php
     function is_connected()
     {
       $connected = @fsockopen("www.some_domain.com", 80); 
        //website, port  (try 80 or 443)
       if ($connected){
          $is_conn = true; //action when connected
          fclose($connected);
       }else{
         $is_conn = false; //action in connection failure
       }
      return $is_conn;
    }
?>

我不想强调自己弄清楚这一点,因此我尝试了这段代码,它对我有用:

function is_connected()
{
  $connected = fopen("http://www.google.com:80/","r");
  if($connected)
  {
     return true;
  } else {
   return false;
  }

} 

请注意:这是基于与 google.com 的连接不太容易失败的假设。

于 2015-01-16T20:08:05.817 回答
4

接受的答案对我不起作用。当互联网断开连接时,它引发了一个php错误。所以我使用它进行了一些修改,如下所示:

if(!$sock = @fsockopen('www.google.com', 80))
{
    echo 'Not Connected';
}
else
{
echo 'Connected';
}
于 2016-02-17T23:01:46.210 回答
3

为什么不从 wget 获取返回码来判断下载是否成功呢?可以在wget exit status找到可能值的列表。

另一方面,您也可以使用 php 的curl 函数,然后您可以在 PHP 中进行所有错误跟踪。

于 2011-02-01T08:44:21.917 回答
1

有多种因素决定互联网连接。例如,接口状态。但是,不管怎样,由于网络的性质,正确的配置并不意味着你有一个工作连接。

因此,最好的方法是尝试下载您确定存在的文件。如果你成功了,你可以按照接下来的步骤。如果没有,请重试一次,然后失败。

尝试在目标主机上选择一个。如果不可能,请选择一些主要网站,例如 google 或 yahoo。

最后,只需尝试检查 wget 返回的错误代码。我敢打赌,对于 404-s 和超时,这些是不同的。您可以在调用中使用第三个参数exec

字符串 exec ( 字符串 $command [, 数组 &$output [, int &$return_var ]] )

于 2011-02-01T08:38:34.373 回答
1
/*
 * Usage: is_connected('www.google.com')
 */
function is_connected($addr)
  {
    if (!$socket = @fsockopen($addr, 80, $num, $error, 5)) {
      echo "OFF";
    } else {
      echo "ON";
    }
  }
于 2018-05-31T11:14:04.850 回答
1

还要注意fopenfsockopen是不同的。fsockopen根据协议前缀打开一个套接字。fopen打开文件或其他东西,例如通过 HTTP 的文件,或流过滤器或其他东西等。最终这会影响执行时间。

于 2020-09-18T11:18:05.573 回答
0

您可以 ping 到一个受欢迎的站点或您正在从中获取的站点(例如 www.google.nl),然后解析结果以查看您是否可以连接到它。

<?php
$ip = '127.0.0.1'; //some ip
exec("ping -n 4 $ip 2>&1", $output, $retval);
if ($retval != 0) { 
echo "no!"; 
} 
else 
{ 
echo "yes!"; }
?>
于 2011-02-01T08:35:48.037 回答
0

只需检查wget. 状态码 4 表示网络问题,状态码 8 表示服务器错误(例如 404)。这仅在您按顺序为每个文件调用 wget 时才有效,而不是为所有文件调用一次。

您也可以libcurl与 PHP 一起使用,而不是调用 wget。就像是:

foreach (...) {
    $c = curl_init($url);
    $f = fopen($filepath, "w")
    curl_setopt($c, CURLOPT_FILE, $f);
    curl_setopt($c, CURLOPT_HEADER, 0);
    if (curl_exec($c)) {
        if (curl_getinfo($c, CURLINFO_HTTP_CODE) == 200) {
            // success
        } else {
            // 404 or something, delete file
            unlink($filepath);
        }
    } else {
        // network error or server down
        break; // abort
    }
    curl_close($c);
}
于 2011-02-01T09:13:05.953 回答
0

这个函数处理你需要的

function isConnected()
{
    // use 80 for http or 443 for https protocol
    $connected = @fsockopen("www.example.com", 80);
    if ($connected){
        fclose($connected);
        return true; 
    }
    return false;
}
于 2017-01-14T09:10:16.907 回答
0

您可以通过在类中添加它来使用它:

private $api_domain  = 'google.com';

private function serverAliveOrNot()
{
    if($pf = @fsockopen($this->api_domain, 443)) {
        fclose($pf);
        $_SESSION['serverAliveOrNot'] = true;
        return true;
    } else {
        $_SESSION['serverAliveOrNot'] = false;
        return false;
    }
}
于 2021-06-02T16:12:10.773 回答
0

+1 对阿尔弗雷德的回答,但我认为这是一个改进版本:

function hasInternet()
{
    $hosts = ['1.1.1.1', '1.0.0.1', '8.8.8.8', '8.8.4.4'];

    foreach ($hosts as $host) {
        if ($connected = @fsockopen($host, 443)) {
            fclose($connected);
            return true;
        }
    }

    return false;
}

我的理由:

  • 这会 ping 超过 1 个服务器,并且仅当所有 4 个服务器都失败时才会失败
  • 如果第一个主机工作,它将true立即返回
  • IP 地址来自 CloudFlare 和 Google DNS,它们基本上控制着大部分互联网并且始终在线
  • 1.1.1.1被评为最快的 DNS 解析器(来源

我唯一的疑问是使用端口 443 还是 80?建议将不胜感激!:)

于 2021-09-01T15:12:26.037 回答