web-dev-qa-db-de.com

file_get_contents, wenn keine URL vorhanden ist

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
}
59
sami

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');
}
95
ynh

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
}
57
Orbling

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.

24
Grzegorz

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);
}
14
nikc.org

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
}
4
Kuijkens

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);
}
3
tfont
$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';
0
SixSense

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.

0
alniks