Я хочу загрузить содержимое URL-адреса с помощью PHP, даже если код ответа HTTP равен 404. file_get_contents будет ошибкой, и я не смог найти ответ с помощью Google. Как я могу это сделать?
Загрузите содержимое URL-адреса в PHP, даже если оно возвращает 404
Ответ 1
По умолчанию file_get_contents возвращает содержимое ответов HTTP 200.
С помощью curl вы получаете заголовки и контент отдельно.
Начиная с PHP 5.0, вы также можете указать контекст для file_get_contents, что позволит вам сделать это, не полагаясь на url (см. ответ Гордона).
Ответ 2
Вы должны настроить потоковую оболочку, чтобы игнорировать ошибки:
ignore_errors
booleanИзвлекать содержимое даже при наличии кодов ошибок. По умолчаниюFALSE
Другими словами, сделать
echo file_get_contents(
    'http://stackoverflow.com/foo/bar',
    false,
    stream_context_create([
        'http' => [
            'ignore_errors' => true,
        ],
    ])
);
и вы получите страницу 404.
Если вы хотите, чтобы это было поведение по умолчанию для потоков HTTP, используйте
stream_context_set_default(
    array('http' => array(
        'ignore_errors' => true)
    )
);
Любые вызовы, использующие упаковщик потока HTTP, будут использовать эти настройки, например, вы можете просто
echo file_get_contents('http://stackoverflow.com/foo/bar');
Если вы также хотите получить заголовок ответа, просто сделайте
print_r($http_response_header);
после звонка. Переменная (re-) заполняется после каждого вызова оболочкой потока http.
Ответ 3
Используйте cURL. Это позволяет значительно усилить контроль и позволит вам прочитать извлеченный контент и код состояния.
Ответ 4
Шаг 1: проверьте код возврата:
 $content = file_get_contents("websitelink");
if($content === FALSE) { // handle error here... }
Шаг 2: подавить предупреждение, поставив оператор управления ошибками (т.е. @) перед вызовом file_get_contents(): $content = @file_get_contents($site);
