get_meta_tags()的异常处理&;get_headers()


Exception handling with get_meta_tags() & get_headers()?

在PHP中,我使用的是get_meta_tags()get_headers(),但是,当有404时,这两个函数会发出警告。有什么办法让我接住它吗?谢谢

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消息;这甚至是可取的,因为你可以立即看到出了问题。不过,我可以想象,你不希望你的客户看到这些警告,但你不应该每次使用函数都这样做,你应该在全局范围内这样做:在生产环境中的php.ini中关闭display_errors,你的客户永远不会看到这样的消息。

也就是说,如果你不希望它们出现在错误日志中,那么在尝试检索元标签之前,你必须检查页面是否存在。get_headers似乎没有抛出警告,而是返回一个数组,其中第一个元素包含字符串"HTTP/1.1 404 Not Found"。你可以利用这个优势:

<?php
$url = 'http://stackoverflow.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"未修改"同样有效。

您可以这样调用它们来使其静音:

@get_meta_tags();

您不能(轻易地)"捕获"它,但您可以检查返回值。

此外,您还可以禁用或重定向警告,请参阅error_reporting()和ini directoves"display_errors"&相像的