php get_headers хороший способ узнать, работает ли сайт?
Я все еще довольно новичок в php. Можете ли вы прокомментировать, полезен ли приведенный ниже код, чтобы определить, работает ли сайт или нет, и если он может не подходить, причины и лучшие альтернативы?
Заранее спасибо.
$siteHeader = @get_headers($url , 1);
if ($siteHeader > 1) {
$siteUp = true;
} else {
$siteUp = false;
}
3 ответа
Я использую curl, но это только я:
function check($url, $ignore = '')
{
$agent = "Mozilla/4.0 (B*U*S)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_VERBOSE, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 45);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 45);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5); //follow up to 10 redirections - avoids loops
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //fix for certificate issue
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //fix for certificate issue
$page = curl_exec($ch);
$err = curl_error($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$codes = array(
0 => 'Domain Not Found',
100 => 'Continue',
101 => 'Switching Protocols',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
307 => 'Temporary Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported'
);
$httpcode_out = 'http: ' . $httpcode . ' (' . $codes[$httpcode] . ')';
$err = 'curl error: ' . $err;
$out = array(
$url,
$httpcode_out,
$err
);
if ($httpcode >= 200 && $httpcode < 307)
{//good
return array(
'Work',
$out
);
}
else
{//BAD
return array(
'Fail',
$out
);
}
}
В зависимости от вашего случая, но, особенно, если ваш URL предоставлен пользователем, я бы пошел на что-то подобное.
//returns true, if domain is availible, false if not
function isDomainAvailible($domain)
{
//check if URL is valid
if(!filter_var($domain, FILTER_VALIDATE_URL)){
return false;
}
$agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_USERAGENT, $agent);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch,CURLOPT_VERBOSE, FALSE);
curl_setopt ($ch, CURLOPT_TIMEOUT, 10);
curl_setopt ($ch,CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch,CURLOPT_SSLVERSION, 3);
curl_setopt ($ch,CURLOPT_SSL_VERIFYHOST, FALSE);
$page=curl_exec($ch);
//echo curl_error($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpcode >= 200 && $httpcode < 300)
return true;
else
return false;
}
Главным образом потому, что некоторые серверы не будут отвечать, если вы не отправите пользовательский агент.
Обновление: чем больше я об этом думаю, тем менее хорошо это выглядит. Я расширил свой первоначальный ответ, который в ретроспективе был наивным.
Это хорошо для базового использования, но вы можете также проверить код ответа HTTP, а не просто проверить, получили ли вы ответ. То, как работает код прямо сейчас, просто говорит вам, что с другой стороны слушал кто-то, что далеко от того, что большинство людей считает "сайт работает".
Вот как легко изолировать код ответа HTTP (или получить false
если запрос не прошел):
$headers = get_headers('http://www.google.com');
$code = $headers ? intval(end(explode(' ', $headers[0], 2))) : false;
Кроме того, существует также проблема перенаправлений: что вы делаете, если видите перенаправление? Сервер, к которому вы обратились, может быть в порядке, но сервер, на который вы перенаправлены, может быть недоступен. Если кто-то наберет URL-адрес в браузере, он будет перенаправлен и в конечном итоге истечет время ожидания, а одношаговый тест скажет, что все в порядке. Что делать, если есть цикл перенаправления? Браузер обнаружит это и в конечном итоге истечет время ожидания, но вам нужно написать довольно много кода, чтобы сделать то же самое.
Таким образом, в конце концов, cURL выглядит как единственное верное решение, потому что делает все это прозрачно.