Как я могу обработать предупреждение функции file_get_contents () в PHP? - PullRequest
279 голосов
/ 07 ноября 2008

Я написал такой код PHP

$site="http://www.google.com";
$content = file_get_content($site);
echo $content;

Но когда я удаляю "http://" из $site, я получаю следующее предупреждение:

Внимание: file_get_contents (www.google.com) [function.file-get-contents]: не удалось открыть поток:

Я пытался try и catch, но это не сработало.

Ответы [ 18 ]

458 голосов
/ 07 ноября 2008

Шаг 1: проверьте код возврата: if($content === FALSE) { // handle error here... }

Шаг 2: подавить предупреждение, поставив оператор контроля ошибок (т.е. @) перед вызовом file_get_contents () : $content = @file_get_contents($site);

129 голосов
/ 04 августа 2010

Вы также можете установить свой обработчик ошибок как анонимную функцию , которая вызывает Exception и использовать попытку / перехват этого исключения.

set_error_handler(
    function ($severity, $message, $file, $line) {
        throw new ErrorException($message, $severity, $severity, $file, $line);
    }
);

try {
    file_get_contents('www.google.com');
}
catch (Exception $e) {
    echo $e->getMessage();
}

restore_error_handler();

Похоже, много кода, чтобы поймать одну маленькую ошибку, но если вы используете исключения во всем приложении, вам нужно будет сделать это только один раз, сверху (например, во включенном конфигурационном файле), и он преобразует все ваши ошибки во все исключения.

59 голосов
/ 13 ноября 2012

Мой любимый способ сделать это довольно просто:

if (!$data = file_get_contents("http://www.google.com")) {
      $error = error_get_last();
      echo "HTTP request failed. Error was: " . $error['message'];
} else {
      echo "Everything went better than expected";
}

Я обнаружил это после эксперимента с try/catch из @enobrev выше, но это позволяет использовать менее длинный (и IMO, более читаемый) код. Мы просто используем error_get_last, чтобы получить текст последней ошибки, а file_get_contents возвращает false при сбое, поэтому простое «если» может это перехватить.

31 голосов
/ 07 ноября 2008

Вы можете добавить @: $content = @file_get_contents($site);

Это подавит любое предупреждение - используйте экономно! . См. Операторы контроля ошибок

Редактировать: при удалении 'http://' вы больше не ищете веб-страницу, а файл на своем диске с именем "www.google ....."

18 голосов
/ 24 июня 2011

Одной из альтернатив является подавление ошибки, а также выдача исключения, которое вы можете перехватить позже. Это особенно полезно, если в вашем коде есть несколько вызовов file_get_contents (), так как вам не нужно подавлять и обрабатывать их все вручную. Вместо этого можно сделать несколько вызовов этой функции в одном блоке try / catch.

// Returns the contents of a file
function file_contents($path) {
    $str = @file_get_contents($path);
    if ($str === FALSE) {
        throw new Exception("Cannot access '$path' to read contents.");
    } else {
        return $str;
    }
}

// Example
try {
    file_contents("a");
    file_contents("b");
    file_contents("c");
} catch (Exception $e) {
    // Deal with it.
    echo "Error: " , $e->getMessage();
}
13 голосов
/ 06 марта 2009

Вот как я это сделал ... Нет необходимости в блоке try-catch ... Лучшее решение всегда самое простое ... Наслаждайтесь!

$content = @file_get_contents("http://www.google.com");
if (strpos($http_response_header[0], "200")) { 
   echo "SUCCESS";
} else { 
   echo "FAILED";
} 
13 голосов
/ 24 февраля 2014
function custom_file_get_contents($url) {
    return file_get_contents(
        $url,
        false,
        stream_context_create(
            array(
                'http' => array(
                    'ignore_errors' => true
                )
            )
        )
    );
}

$content=FALSE;

if($content=custom_file_get_contents($url)) {
    //play with the result
} else {
    //handle the error
}
6 голосов
/ 24 февраля 2014

Вот как я справлюсь с этим:

$this->response_body = @file_get_contents($this->url, false, $context);
if ($this->response_body === false) {
    $error = error_get_last();
    $error = explode(': ', $error['message']);
    $error = trim($error[2]) . PHP_EOL;
    fprintf(STDERR, 'Error: '. $error);
    die();
}
3 голосов
/ 07 ноября 2008

Лучше всего было бы установить собственные обработчики ошибок и исключений, которые будут делать что-то полезное, например, регистрировать это в файле или отправлять по электронной почте критические сообщения. http://www.php.net/set_error_handler

1 голос
/ 08 февраля 2019

Самый простой способ сделать это - просто добавить @ перед file_get_contents я. e.:

$content = @file_get_contents($site); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...