2011-01-05 9 views
19

Chcę sprawdzić, czy witryna jest w górę lub w dół w określonej instancji za pomocą PHP. Dowiedziałem się, że curl pobierze zawartość pliku, ale nie chcę czytać zawartości strony. Chcę tylko sprawdzić stan strony. Czy istnieje sposób sprawdzenia stanu witryny? Czy możemy użyć polecenia ping, aby sprawdzić status? Wystarczy, że otrzymam od serwera sygnały statusu (404, 403 itd.). Mały fragment kodu może mi bardzo pomóc.zwijanie i pingowanie - jak sprawdzić, czy witryna jest w górę czy w dół?

+2

Jak definiujesz "up"? Pusta strona, która zwraca HTTP '200' jest już dostępna? – webbiedave

+0

@Nate: Dziękujemy za edycję! – brainless

Odpowiedz

42

coś jak to powinno działać

$url = 'yoururl'; 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_exec($ch); 
    $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    if (200==$retcode) { 
     // All's well 
    } else { 
     // not so much 
    } 
+1

Ja również wolę ustawić "CURLOPT_CONNECTTIMEOUT" i "CURLOPT_TIMEOUT", aby obniżyć wartości. – machineaddict

+0

@machineaddict Czy chcesz zastąpić "witrynę offline" zamiast czekać na połączenie? Nie widzę różnicy między 2-krotnym sprawdzeniem dla jednej rzeczy i czekaniem kilka na bieżącą operację. – erm3nda

+0

@machineaddict Nawet przy ustawieniu CURLOPT_FOLLOWLOCATION na wartość true, nadal zwraca kod powrotu 301 ... Jak to jest możliwe? –

5

Widziałeś funkcję get_headers()? http://it.php.net/manual/en/function.get-headers.php. Wydaje się, że robi dokładnie to, czego potrzebujesz.

Jeśli użyjesz curl bezpośrednio z opcją -I, zwróci nagłówki HTTP (404 itd.) Zamiast HTML strony. W PHP odpowiednikiem jest opcja curl_setopt($ch, CURLOPT_NOBODY, 1);.

2

ping nie zrobi tego, czego szukasz - powie ci tylko, czy maszyna jest gotowa (i odpowiada na ping). Nie musi to jednak oznaczać, że serwer internetowy działa.

Możesz spróbować użyć metody http_head - pobierze ona nagłówki wysyłane przez serwer WWW. Jeśli serwer wysyła nagłówki z powrotem, oznacza to, że jest on uruchomiony.

+0

Ten wbudowany hiperlink http://ca.php.net/http_head przekierowuje do http://ca.php.net/manual-lookup.php?pattern=http_head&lang=en&scope=404quickref, który zawiera następujący komunikat: *** http_head * * nie istnieje. Najbliższe dopasowania: *. Odpowiedź należy edytować, aby zawierała prawidłowe odniesienie. –

2

Nie można przetestować serwera WWW pod numerem ping, ponieważ jest to inna usługa. Serwer może być uruchomiony, ale demona serwera sieciowego może i tak ulec awarii. Więc curl jest twoim przyjacielem. Po prostu zignoruj ​​zawartość.

9
function checkStatus($url) { 
    $agent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; pt-pt) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"; 

    // initializes curl session 
    $ch = curl_init(); 

    // sets the URL to fetch 
    curl_setopt($ch, CURLOPT_URL, $url); 

    // sets the content of the User-Agent header 
    curl_setopt($ch, CURLOPT_USERAGENT, $agent); 

    // make sure you only check the header - taken from the answer above 
    curl_setopt($ch, CURLOPT_NOBODY, true); 

    // follow "Location: " redirects 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

    // return the transfer as a string 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    // disable output verbose information 
    curl_setopt($ch, CURLOPT_VERBOSE, false); 

    // max number of seconds to allow cURL function to execute 
    curl_setopt($ch, CURLOPT_TIMEOUT, 5); 

    // execute 
    curl_exec($ch); 

    // get HTTP response code 
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

    curl_close($ch); 

    if ($httpcode >= 200 && $httpcode < 300) 
     return true; 
    else 
     return false; 
} 

// how to use 
//=================== 
if ($this->checkStatus("http://www.dineshrabara.in")) 
    echo "Website is up"; 
else 
    echo "Website is down"; 
exit; 
6
curl -Is $url | grep HTTP | cut -d ' ' -f2 
+11

Podając kod, który rozwiązuje problem, najlepiej jest również Podaj co najmniej krótkie wyjaśnienie, jak to działa, aby czytanie osób nie musiało go psychicznie analizować wiersz po wierszu, aby zrozumieć różnice. – Fluffeh

4

Oto jak to zrobiłem. Ustawiłem agenta użytkownika, aby zminimalizować ryzyko, że cel mnie zakazał, a także wyłączyłem weryfikację SSL, ponieważ znam cel:

private static function checkSite($url) { 
    $useragent = $_SERVER['HTTP_USER_AGENT']; 

    $options = array(
      CURLOPT_RETURNTRANSFER => true,  // return web page 
      CURLOPT_HEADER   => false,  // do not return headers 
      CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
      CURLOPT_USERAGENT  => $useragent, // who am i 
      CURLOPT_AUTOREFERER => true,  // set referer on redirect 
      CURLOPT_CONNECTTIMEOUT => 2,   // timeout on connect (in seconds) 
      CURLOPT_TIMEOUT  => 2,   // timeout on response (in seconds) 
      CURLOPT_MAXREDIRS  => 10,   // stop after 10 redirects 
      CURLOPT_SSL_VERIFYPEER => false,  // SSL verification not required 
      CURLOPT_SSL_VERIFYHOST => false,  // SSL verification not required 
    ); 
    $ch = curl_init($url); 
    curl_setopt_array($ch, $options); 
    curl_exec($ch); 

    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    return ($httpcode == 200); 
} 
Powiązane problemy