2011-02-01 4 views
35

Jak mogę sprawdzić, czy jestem podłączony do Internetu z mojego skryptu PHP, który działa na moim komputerze?Określanie w skrypcie php, jeśli jest podłączony do Internetu?

Uruchomiłem skrypt, aby pobrać zestaw plików (które mogą lub nie istnieją) za pomocą wget. Jeśli spróbuję pobrać bez połączenia, wget przejdzie do następnego, myśląc, że plik nie jest obecny.

Odpowiedz

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

+ Dobra odpowiedź, być może ktoś inny pomyśli, że '[80 | 443]' przełączy się między dowolnymi portami ... :) – Baba

+0

Masz rację @Baba ... :) –

+1

Na podstawie [tego] (https: // www .quora.com/Downtime/What-is-the-najbardziej-niezawodny-website-in-terms-of-uptime) post, prawdopodobnie miałoby sens używać example.com jako "www.some_domain.com "odpowiedzi. – nzn

0

Można wysłać polecenie ping do popularnej witryny lub strony, z której się korzysta (np. Www.google. nl), a następnie przeanalizuj wynik, aby sprawdzić, czy możesz się z nim połączyć.

<?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!"; } 
?> 
+0

Wyłączając nie rzeczywiście to zrobić za pomocą adresu IP. –

+0

A dlaczego nie korzystać z niektórych adresów IP? Dokładnie to dzieje się za kulisami przy użyciu jakiejś domeny. – killstreet

6

Zawsze można ping dobra „ol wierny Google:

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

Jest to całkiem niezawodny, ale należy pamiętać, że "ICMP działa! = TCP działa" (co z zaporami ogniowymi, NAT i innymi), a nawet "TCP działa! = Działa HTTP" (transparentne proxy itp.). – Piskvor

1

Istnieje wiele czynników, które decydują połączenia internetowego. Stan interfejsu na przykład. Ale względy tych, ze względu na naturę sieci, właściwa konfiguracja nie oznacza, że ​​masz działające połączenie.

Najlepszym sposobem jest pobranie pliku, który na pewno istnieje. Jeśli ci się uda, możesz przejść do kolejnych kroków. Jeśli nie, spróbuj raz, a następnie zawieść.

Spróbuj wybrać jedną z hosta docelowego. Jeśli nie jest to możliwe, wybierz jedną z głównych witryn takich jak Google lub Yahoo.

Na koniec spróbuj sprawdzić kod błędu zwrócony przez wget. Założę się, że są różne dla 404-s i timeoutów. Można użyć trzeci parametr w exec rozmowy:

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

3

Dlaczego nie można pobrać kod zwrotny od wget, aby określić, czy pobieranie powiodło? Listę możliwych wartości można znaleźć pod adresem wget exit status.

Z drugiej strony można również użyć php: curl functions, a następnie można wykonać śledzenie błędów z poziomu PHP.

0

Wystarczy sprawdzić wynik wget. Kod stanu 4 oznacza problem z siecią, kod stanu 8 oznacza błąd serwera (na przykład 404). Działa to tylko wtedy, gdy wywołujesz wget dla każdego pliku w sekwencji, a nie raz dla wszystkich plików.

Można również użyć libcurl w PHP, zamiast wywoływać wget. Coś jak:

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

Stała dla kodu http to CURLINFO_HTTP_CODE –

5

Ten kod został braku w laravel ram 4,2 php w wewnętrzny serwer 500 błędu:

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

czego nie chcą podkreślić się do tego dowiedzieć, dlatego starałem ten kod i pracował dla mnie:

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

} 

Uwaga: ta opiera się na założeniu, że połączenie google.com jest mniej podatny na uszkodzenia.

0

Przyjęta odpowiedź nie działa dla mnie. Po odłączeniu Internetu wystąpił błąd php. Więc użyłem go z niewielką modyfikacją, która jest poniżej:

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

Funkcja ta obsługuje co trzeba

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