it-swarm.dev

file_get_contents, gdy adres URL nie istnieje

Używam file_get_contents (), aby uzyskać dostęp do adresu URL. 

file_get_contents('http://somenotrealurl.com/notrealpage');

Jeśli adres URL nie jest prawdziwy, zwraca ten komunikat o błędzie. W jaki sposób mogę sprawić, aby błąd był wdzięczny, aby wiedzieć, że strona nie istnieje i działa odpowiednio bez wyświetlania tego komunikatu o błędzie?

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

na przykład w zend możesz powiedzieć: 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

Musisz sprawdzić kod odpowiedzi HTTP :

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

Za pomocą takich poleceń w PHP możesz poprzedzić je @, aby ukryć takie ostrzeżenia.

@file_get_contents('http://somenotrealurl.com/notrealpage');

file_get_contents () zwraca FALSEjeśli wystąpi awaria, więc jeśli sprawdzisz zwrócony wynik, możesz poradzić sobie z awarią

$pageDocument = @file_get_contents('http://somenotrealurl.com/notrealpage');

if ($pageDocument === false) {
    // Handle error
}
58
Orbling

Za każdym razem, gdy wywołujesz file_get_contents z opakowaniem http, tworzona jest zmienna w lokalnym zasięgu: $ http_response_header

Ta zmienna zawiera wszystkie nagłówki HTTP. Ta metoda jest lepsza niż funkcja get_headers(), ponieważ wykonywane jest tylko jedno żądanie.

Uwaga: 2 różne żądania mogą kończyć się inaczej. Na przykład get_headers() zwróci 503, a file_get_contents () zwróci 200. Otrzymasz poprawne wyjście, ale nie użyjesz go z powodu błędu 503 w wywołaniu get_headers ().

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'];

To podejście umożliwia także śledzenie kilku nagłówków żądań przechowywanych w różnych zmiennych, ponieważ jeśli użyjesz file_get_contents () $ http_response_header zostanie nadpisany w lokalnym zasięgu.

24
Grzegorz

Podczas gdy file_get_contents jest bardzo zwięzły i wygodny, mam tendencję do faworyzowania biblioteki Curl dla lepszej kontroli. Oto przykład.

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

Aby uniknąć podwójnych żądań skomentowanych przez Orbling na odpowiedź ynh możesz połączyć ich odpowiedzi. Jeśli otrzymasz prawidłową odpowiedź, użyj tego. Jeśli nie, sprawdź, na czym polegał problem (w razie potrzeby).

$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

Prosty i funkcjonalny (łatwy w użyciu w dowolnym miejscu):

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;
    }
}

Przykład:

$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';

Normalny

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..
}

Pro

if (substr(get_headers($url)[0], 9, 3) == 200) {
    // URL is online, do something..
}

Poziom wtf

(substr(get_headers($url)[0], 9, 3) == 200) ? echo 'Online' : echo 'Offline';
0
SixSense

Możesz dodać 'ignore_errors' => true do opcji:

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

W takim przypadku będziesz mógł odczytać odpowiedź z serwera.

0
alniks