如果连接到互联网,在PHP脚本中确定?

时间:2011-02-01 08:29:42

标签: php internet-connection

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

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

12 个答案:

答案 0 :(得分:75)

<?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;

}
?>

答案 1 :(得分:7)

你可以随时ping好'ol trusty google:

$response = null;
system("ping -c 1 google.com", $response);
if($response == 0)
{
    // this means you are connected
}

答案 2 :(得分:6)

此代码在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的连接不太容易失败的假设。

答案 3 :(得分:3)

为什么不从wget获取返回代码以确定下载是否成功?可以在wget exit status找到可能值列表。

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

答案 4 :(得分:1)

有各种因素决定互联网连接。例如,接口状态。但是,由于网络的性质,适当的配置并不意味着你有一个有效的连接。

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

尝试在目标主机上选择一个。如果不可能,请选择一些主要网站,如谷歌或雅虎。

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

  

string exec(string $ command [,array&amp; $ output [,int&amp; $ return_var]])

答案 5 :(得分:1)

/*
 * Usage: is_connected('www.google.com')
 */
function is_connected($addr)
  {
    if (!$socket = @fsockopen($addr, 80, $num, $error, 5)) {
      echo "OFF";
    } else {
      echo "ON";
    }
  }

答案 6 :(得分:1)

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

答案 7 :(得分: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!"; }
?>

答案 8 :(得分: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);
}

答案 9 :(得分:0)

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

if(!$sock = @fsockopen('www.google.com', 80))
{
    echo 'Not Connected';
}
else
{
echo 'Connected';
}

答案 10 :(得分: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;
}

答案 11 :(得分: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;
    }
}