2017-05-24 4 views
0

get_headers() löst eine Warnung aus, wenn die geprüfte URL ungültig ist. Z. B.So unterdrücken Sie Fehler in get_headers() ohne Verwendung von @

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

Warnung: get_headers(): php_network_getaddresses: getaddrinfo failed: No such Host bekannt ist

Ist es möglich, withou mit @ diesen Fehler zu unterdrücken?

Mein Hauptziel ist es zu überprüfen, ob eine URL existiert oder nicht, aber ich möchte nicht die @ Suppressor verwenden.

+0

Sie können PHP-Warnung deaktivieren, indem Sie error_reporting (E_ERROR | E_PARSE); oder error_reporting (0); Sie müssen also kein @ -Zeichen verwenden. und mit curl können Sie etwas wie curl_getinfo ($ curl, CURLINFO_HTTP_CODE); –

+0

Verwenden Sie [curl] (http://php.net/manual/en/book.curl.php) mit den Optionen "CURLOPT_HEADER" und "CURLOPT_RETURNTRANSFER". (Und vielleicht 'CURLOPT_NOBODY' je nachdem, was Sie wollen.) –

+0

Werfen Sie einen Blick auf https://StackOverflow.com/Questions/1241728/Cani-Itry-Catch-a-Warnung – vzwick

Antwort

2

Sie können mit Curl überprüfen und es werden keine Warnungen ausgegeben. Wenn Sie 'CURLOPT_NOBODY' verwenden, wird nicht versucht, die ganze Seite herunterzuladen.

<?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"; 
} 
+0

IMO ist dies der beste Ansatz. – ceejayoz

+0

Vielleicht hat es sich in den letzten Versionen geändert, aber [Curl kann anscheinend auch Warnungen auslösen] (https: // stackoverflow.com/questions/21984964/curl-error-warning-curl-exec-45-ist-nicht-eine-valide-curl-handle-resource). –

1

Ich gehe davon aus, dass Sie es so gehandhabt wollen, das nicht mit Ihren error_reporting und log_errors Richtlinien nicht stört. Der einzige Weg, an den ich denken kann, ist ein custom error handler schreiben. Hier ist ein Beispiel aus der PHPMailer Bibliothek:

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(); 

Wenn nötig, gibt es immer zusätzliche Sachen Feinabstimmung entweder im set_error_handler() Anruf und der Handler-Code selbst . Hier ist ein weiteres Beispiel aus Guzzle, die eine anonyme Funktion verwendet:

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(); 
-1

ändern die Höhe der Fehlerberichterstattung vor der Funktion, sie nach der Funktion zurückkehrt.

// 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); 

Warum wird dies eine -1? Dieser Code funktioniert [in PHP 5.6.3]. Versuch es.

Code-Beispiel (Kopieren, Upload und genießen):

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!"; 

Dieser Code gibt nur zwei Fehlermeldungen sowohl in Bezug 5. Es wird auch Ausgang "done", unter der Leitung.

Verwandte Themen