Ich verwende file_get_contents (), um auf eine URL zuzugreifen.
file_get_contents('http://somenotrealurl.com/notrealpage');
Wenn die URL nicht echt ist, wird diese Fehlermeldung zurückgegeben. Wie kann ich es fehlerfrei anzeigen lassen, damit ich weiß, dass die Seite nicht existiert, und entsprechend handeln, ohne diese Fehlermeldung anzuzeigen?
file_get_contents('http://somenotrealurl.com/notrealpage')
[function.file-get-contents]:
failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found
in myphppage.php on line 3
in zend können Sie zum Beispiel sagen: if ($request->isSuccessful())
$client = New Zend_Http_Client();
$client->setUri('http://someurl.com/somepage');
$request = $client->request();
if ($request->isSuccessful()) {
//do stuff with the result
}
Sie müssen den HTTP-Antwortcode überprüfen :
function get_http_response_code($url) {
$headers = get_headers($url);
return substr($headers[0], 9, 3);
}
if(get_http_response_code('http://somenotrealurl.com/notrealpage') != "200"){
echo "error";
}else{
file_get_contents('http://somenotrealurl.com/notrealpage');
}
Mit solchen Befehlen in PHP können Sie einen @
voranstellen, um solche Warnungen zu unterdrücken.
@file_get_contents('http://somenotrealurl.com/notrealpage');
file_get_contents () gibt FALSE
zurück, wenn ein Fehler auftritt. Wenn Sie also das zurückgegebene Ergebnis prüfen, können Sie den Fehler behandeln
$pageDocument = @file_get_contents('http://somenotrealurl.com/notrealpage');
if ($pageDocument === false) {
// Handle error
}
Bei jedem Aufruf von file_get_contents
mit einem http-Wrapper wird eine Variable im lokalen Bereich erstellt: $ http_response_header
Diese Variable enthält alle HTTP-Header. Diese Methode ist besser als die Funktion get_headers()
, da nur eine Anforderung ausgeführt wird.
Hinweis: 2 verschiedene Anforderungen können unterschiedlich enden. Zum Beispiel gibt get_headers()
503 und file_get_contents () 200 zurück. Außerdem erhalten Sie eine korrekte Ausgabe, die jedoch aufgrund eines 503-Fehlers im get_headers () - Aufruf nicht verwendet wird.
function getUrl($url) {
$content = file_get_contents($url);
// you can add some code to extract/parse response number from first header.
// For example from "HTTP/1.1 200 OK" string.
return array(
'headers' => $http_response_header,
'content' => $content
);
}
// Handle 40x and 50x errors
$response = getUrl("http://example.com/secret-message");
if ($response['content'] === FALSE)
echo $response['headers'][0]; // HTTP/1.1 401 Unauthorized
else
echo $response['content'];
Bei diesem Ansatz können Sie auch nur wenige Anforderungsheader in verschiedenen Variablen speichern, da bei Verwendung von file_get_contents () $ http_response_header im lokalen Bereich überschrieben wird.
Während file_get_contents
sehr knapp und bequem ist, neige ich dazu, die Curl-Bibliothek für eine bessere Kontrolle zu bevorzugen. Hier ist ein Beispiel.
function fetchUrl($uri) {
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $uri);
curl_setopt($handle, CURLOPT_POST, false);
curl_setopt($handle, CURLOPT_BINARYTRANSFER, false);
curl_setopt($handle, CURLOPT_HEADER, true);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 10);
$response = curl_exec($handle);
$hlength = curl_getinfo($handle, CURLINFO_HEADER_SIZE);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
$body = substr($response, $hlength);
// If HTTP response is not 200, throw exception
if ($httpCode != 200) {
throw new Exception($httpCode);
}
return $body;
}
$url = 'http://some.Host.com/path/to/doc';
try {
$response = fetchUrl($url);
} catch (Exception $e) {
error_log('Fetch URL failed: ' . $e->getMessage() . ' for ' . $url);
}
Um Doppelanfragen zu vermeiden, die von Orbling zur Antwort von ynh kommentiert wurden, können Sie deren Antworten kombinieren. Wenn Sie überhaupt eine gültige Antwort erhalten, verwenden Sie diese. Wenn nicht, finden Sie heraus, was das Problem war (falls erforderlich).
$urlToGet = 'http://somenotrealurl.com/notrealpage';
$pageDocument = @file_get_contents($urlToGet);
if ($pageDocument === false) {
$headers = get_headers($urlToGet);
$responseCode = substr($headers[0], 9, 3);
// Handle errors based on response code
if ($responseCode == '404') {
//do something, page is missing
}
// Etc.
} else {
// Use $pageDocument, echo or whatever you are doing
}
Einfach und funktionell (überall einfach zu verwenden):
function file_contents_exist($url, $response_code = 200)
{
$headers = get_headers($url);
if (substr($headers[0], 9, 3) == $response_code)
{
return TRUE;
}
else
{
return FALSE;
}
}
Beispiel:
$file_path = 'http://www.google.com';
if(file_contents_exist($file_path))
{
$file = file_get_contents($file_path);
}
$url = 'https://www.yourdomain.com';
Normal
function checkOnline($url) {
$headers = get_headers($url);
$code = substr($headers[0], 9, 3);
if ($code == 200) {
return true;
}
return false;
}
if (checkOnline($url)) {
// URL is online, do something..
$getURL = file_get_contents($url);
} else {
// URL is offline, throw an error..
}
Profi
if (substr(get_headers($url)[0], 9, 3) == 200) {
// URL is online, do something..
}
Wtf Ebene
(substr(get_headers($url)[0], 9, 3) == 200) ? echo 'Online' : echo 'Offline';
Sie können den Optionen 'ignore_errors' => true hinzufügen:
$options = array(
'http' => array(
'ignore_errors' => true,
'header' => "Content-Type: application/json\r\n"
)
);
$context = stream_context_create($options);
$result = file_get_contents('http://example.com', false, $context);
In diesem Fall können Sie eine Antwort vom Server lesen.