Обработка исключений с помощью get_meta_tags() & get_headers()?
В PHP я использую get_meta_tags()
а также get_headers()
однако при наличии 404 эти две функции выдают предупреждение. Есть ли способ для меня поймать это? Спасибо!
3 ответа
get_headers
не выдает предупреждение / ошибку на 404, но get_meta_tags
делает.
Таким образом, вы можете проверить ответ заголовка и сделать что-нибудь, когда это не в порядке:
$url = 'http://www.example.com/';
$headers = array();
$metatags = array();
$validhost = filter_var(gethostbyname(parse_url($url,PHP_URL_HOST)), FILTER_VALIDATE_IP);
if($validhost){
// get headers only when Domain is valid
$headers = get_headers($url, 1);
if(substr($headers[0], 9, 3) == '200'){
// read Metatags only when Statuscode OK
$metatags = get_meta_tags($url);
}
}
эти две функции выдают предупреждение. Есть ли способ для меня поймать это?
Вы не должны заботиться. Естественно, сообщение E_WARNING при сбое во время разработки - это нормально; это даже желательно, так как сразу видно, что что-то пошло не так. Я могу себе представить, что вы не хотите, чтобы ваши клиенты видели эти предупреждения, но вы не должны делать это для каждого использования функции, вы должны делать это глобально: отключите display_errors в php.ini в производственной среде и Ваши клиенты никогда не увидят такие сообщения.
Тем не менее, если вы не хотите, чтобы они появлялись в журналах ошибок, вам нужно проверить, существует ли страница, прежде чем пытаться получить метатеги. get_headers не выдает предупреждение, а возвращает массив, первый элемент которого содержит строку "HTTP/1.1 404 Not Found". Вы можете использовать это в ваших интересах:
<?php
$url = 'http://stackru.com';
$headers = get_headers( $yoururl );
preg_match( '~HTTP/1.(?:1|0) (\d{3})~', $headers[0], $matches );
$code = $matches[1];
if( $code === '200' ) {
$tags = get_meta_tags( $url );
}
Если вы начнете использовать этот код, помните, что 200 - не единственное уведомление об успешном запросе; 304 Not Modified - например - одинаково действителен.
Вы можете заставить это замолчать, называя их так:
@get_meta_tags();
Вы не можете "поймать" это (легко), но вы можете проверить возвращаемые значения.
Кроме того, вы можете отключить или перенаправить предупреждения, см. Error_reporting() и ini directoves "display_errors" и аналогичные.