Определить в php скрипт, если подключен к интернету? - PullRequest
42 голосов
/ 01 февраля 2011

Как я могу проверить, подключен ли я к Интернету из моего PHP-скрипта, который работает на моем компьютере разработчика?

Я запускаю скрипт для загрузки набора файлов (которые могут существовать или не существовать).) используя wget.Если я пытаюсь загрузить файл без подключения, wget переходит к следующему, думая, что файл отсутствует.

Ответы [ 10 ]

75 голосов
/ 01 февраля 2011
<?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;

}
?>
7 голосов
/ 01 февраля 2011

Вы всегда можете проверить связь с Google.

$response = null;
system("ping -c 1 google.com", $response);
if($response == 0)
{
    // this means you are connected
}
6 голосов
/ 16 января 2015

В коде php платформы laravel 4.2 произошла ошибка с ошибкой внутреннего сервера 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 голосов
/ 01 февраля 2011

Почему бы вам не получить код возврата от wget, чтобы определить, была ли загрузка успешной?Список возможных значений можно найти по адресу wget exit status .

С другой стороны, вы также можете использовать php's curl functions , тогда вы можете делать всеотслеживание ошибок из PHP.

1 голос
/ 31 мая 2018
/*
 * Usage: is_connected('www.google.com')
 */
function is_connected($addr)
  {
    if (!$socket = @fsockopen($addr, 80, $num, $error, 5)) {
      echo "OFF";
    } else {
      echo "ON";
    }
  }
1 голос
/ 01 февраля 2011

Существуют различные факторы, которые определяют интернет-соединение.Состояние интерфейса, например.Но, несмотря на это, из-за природы сети правильная конфигурация не означает, что у вас есть работающее соединение.

Так что лучший способ - это скачать файл, который, как вы уверены, существует.Если вам это удастся, вы можете перейти к следующим шагам.Если нет, повторите попытку один раз, а затем потерпите неудачу.

Попробуйте выбрать один на хосте назначения.Если это невозможно, выберите какой-нибудь крупный веб-сайт, например, Google или Yahoo.

Наконец, просто попробуйте проверить код ошибки, возвращенный wget.Бьюсь об заклад, они разные для 404-х и тайм-аутов.Вы можете использовать третий параметр в exec call:

string exec (строка $ command [, массив & $ output [, int & $ return_var]])

0 голосов
/ 14 января 2017

Эта функция обрабатывает то, что вам нужно

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;
}
0 голосов
/ 18 февраля 2016

Принятый ответ не работает для меня.Когда интернет был отключен, он выдал ошибку php.Поэтому я использовал его с небольшой модификацией, которая ниже:

if(!$sock = @fsockopen('www.google.com', 80))
{
    echo 'Not Connected';
}
else
{
echo 'Connected';
}
0 голосов
/ 01 февраля 2011

Просто проверьте результат 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);
}
0 голосов
/ 01 февраля 2011

Вы можете проверить связь с популярным сайтом или сайтом, с которого вы делаете заметки (например, www.google.nl), а затем проанализировать результат, чтобы узнать, сможете ли вы к нему подключиться.

...