如何在不使用@的情况下抑制get_headers()中的错误

时间:2017-05-24 14:54:13

标签: php

如果要检查的URL无效,

get_headers()会发出警告。如,

get_headers('http://nonexistingrubbish-url.com');

  

警告:get_headers():php_network_getaddresses:getaddrinfo失败:没有这样的主机已知

是否可以使用@

来抑制此错误

我的主要目标是检查网址是否存在,但我不想使用@抑制器。

3 个答案:

答案 0 :(得分:2)

您可以使用curl进行检查,但不会返回任何警告。如果您使用'CURLOPT_NOBODY',则不会尝试下载整页。

<?php
$url = "http://nonexistingrubbish-url.com";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_NOBODY, true);
$result = curl_exec($curl);
if ($result !== false) {
    $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if ($statusCode == 404) {
        echo "URL Not Exists";
    } else {
        echo "URL Exists";
    }
} else {
    echo "URL not Exists";
}

答案 1 :(得分:1)

我认为您希望以不会干扰error_reportinglog_errors指令的方式处理它。我能想到的唯一方法就是写custom error handler。这是PhpMailer库中的一个例子:

Error handler

/**
 * Reports an error number and string.
 *
 * @param int    $errno   The error number returned by PHP
 * @param string $errmsg  The error message returned by PHP
 * @param string $errfile The file the error occurred in
 * @param int    $errline The line number the error occurred on
 */
protected function errorHandler($errno, $errmsg, $errfile = '', $errline = 0)
{
    $notice = 'Connection failed.';
    $this->setError(
        $notice,
        $errmsg,
        (string) $errno
    );
    $this->edebug(
        "$notice Error #$errno: $errmsg [$errfile line $errline]",
        self::DEBUG_CONNECTION
    );
}

Usage:

// Begin encrypted connection
set_error_handler([$this, 'errorHandler']);
$crypto_ok = stream_socket_enable_crypto(
    $this->smtp_conn,
    true,
    $crypto_method
);
restore_error_handler();

如果有必要,可以在set_error_handler()调用和处理程序代码本身中进行微调。这是Guzzle使用匿名函数的另一个例子:

Error handler and Usage:

$errors = null;
set_error_handler(function ($_, $msg, $file, $line) use (&$errors) {
    $errors[] = [
        'message' => $msg,
        'file'    => $file,
        'line'    => $line
    ];
    return true;
});
$resource = $callback();
restore_error_handler();

答案 2 :(得分:0)

在功能之前更改错误报告的级别,在功能之后将其还原。

// Show all errors except warnings. 
error_reporting(E_ALL & ~E_WARNING);
get_headers('http://nonexistingrubbish-url.com');
// revert to the above error reporting level. 
error_reporting(E_ALL);
  

为什么这会得到-1?此代码适用于[PHP 5.6.3]。试试吧。

代码示例(复制,上传和欣赏):

ini_set("display_errors",1); 
error_reporting(E_ALL & ~E_WARNING);
get_headers('http://nonexistingrubbish-url.com'); 
error_reporting(E_ALL);
get_headers('http://nonexistingrubbish-url.com'); 
print "<br><Br>done!";

此代码仅输出与第5行相关的两条错误消息。 它还将在下面输出&#34; done&#34;。