Как я могу проверить, подключен ли я к Интернету из моего PHP-скрипта, который работает на моей машине dev?
Я запускаю сценарий для загрузки набора файлов (которые могут или не могут существовать) с помощью wget. Если я попробую скачать без подключения, wget переходит к следующему, думая, что файл отсутствует.
<?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; } ?>
Вы всегда можете ping good 'ol trusty google:
$response = null; system("ping -c 1 google.com", $response); if($response == 0) { // this means you are connected }
Этот код терпел неудачу в laravel 4.2 php framework с ошибкой внутреннего сервера 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 менее подвержено сбою.
Почему вы не получаете код возврата из wget, чтобы определить, была ли загрузка успешной? Список возможных значений можно найти в статусе выхода wget .
С другой стороны, вы можете использовать функции curl php, а затем вы можете отслеживать ошибки в PHP.
Существуют различные факторы, определяющие подключение к Интернету. Состояние интерфейса, например. Но, если учесть, что из-за характера сети правильная конфигурация не влияет на ваше рабочее соединение.
Поэтому лучше всего попытаться загрузить файл, который, как вы уверены, существует. Если вам это удастся, вы можете перейти к следующим шагам. Если нет, повторите попытку, а затем выполните сбой.
Попробуйте выбрать один на целевом хосте. Если это невозможно, выберите какой-то важный веб-сайт, например google или yahoo.
Наконец, попробуйте проверить код ошибки, возвращаемый wget. Бьюсь об заклад, они различаются для 404-х и тайм-аутов. Вы можете использовать третий параметр в вызове exec
:
string exec (строка $ command [, array & $ output [, int & $ return_var]])
http://www.weberdev.com/get_example-4025.html
Тонны примеров на google. Однако, если вы потеряли соединение во время загрузки, не ожидайте, что это будет так просто.
Вы можете выполнить ping на популярный сайт или на сайт, из которого вы зашли (например, http://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!"; } ?>
Просто проверьте результат 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); }
Принятый ответ не сработал для меня. Когда интернет был отключен, он выбросил ошибку php. Поэтому я использовал его с небольшой модификацией, которая ниже:
if(!$sock = @fsockopen('www.google.com', 80)) { echo 'Not Connected'; } else { echo 'Connected'; }
Эта функция обрабатывает то, что вам нужно
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; }