Обработка исключений с помощью 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" и аналогичные.

Другие вопросы по тегам