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ół?
Odpowiedz
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
}
Ja również wolę ustawić "CURLOPT_CONNECTTIMEOUT" i "CURLOPT_TIMEOUT", aby obniżyć wartości. – machineaddict
@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
@machineaddict Nawet przy ustawieniu CURLOPT_FOLLOWLOCATION na wartość true, nadal zwraca kod powrotu 301 ... Jak to jest możliwe? –
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);
.
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.
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. –
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ść.
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;
curl -Is $url | grep HTTP | cut -d ' ' -f2
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
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);
}
Jak definiujesz "up"? Pusta strona, która zwraca HTTP '200' jest już dostępna? – webbiedave
@Nate: Dziękujemy za edycję! – brainless