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