Как я могу обработать предупреждение о функции file_get_contents() в PHP?

Я написал 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, но это не сработало.

Ответ 1

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

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

Ответ 2

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

set_error_handler(
    create_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();

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

Ответ 3

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

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 при сбое, поэтому простое "if" может это поймать.

Ответ 4

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

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

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

Ответ 5

Один из вариантов - подавить ошибку, а также выбросить исключение, которое вы можете поймать позже. Это особенно полезно, если в коде есть несколько вызовов 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();
}

Ответ 6

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

$content = @file_get_contents("http://www.google.com");
if (strpos($http_response_header[0], "200")) { 
   echo "SUCCESS";
} else { 
   echo "FAILED";
} 

Ответ 7

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
}

Ответ 8

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

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

Ответ 9

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

Ответ 10

Вы можете использовать этот script

$url = @file_get_contents("http://www.itreb.info");
if ($url) {
    // if url is true execute this 
    echo $url;
} else {
    // if not exceute this 
    echo "connection error";
}

Ответ 11

Поскольку PHP 4 использует error_reporting():

$site="http://www.google.com";
$old_error_reporting = error_reporting(E_ALL ^ E_WARNING);
$content = file_get_content($site);
error_reporting($old_error_reporting);
if ($content === FALSE) {
    echo "Error getting '$site'";
} else {
    echo $content;
}

Ответ 12

Это попытается получить данные, если это не сработает, оно поймает ошибку и позволит вам делать все, что вам нужно в catch.

try {
    $content = file_get_contents($site);
} catch(\Exception $e) {
    return 'The file was not found';
}

Ответ 13

try {
   $site="http://www.google.com";
   $content = file_get_content($site);
   echo $content;
} catch (ErrorException $e) {
    // fix the url

}

set_error_handler(function ($errorNumber, $errorText, $errorFile,$errorLine ) 
{
    throw new ErrorException($errorText, 0, $errorNumber, $errorFile, $errorLine);
});

Ответ 14

Измените файл php.ini

allow_url_fopen = On

allow_url_include = On

Ответ 15

Вы также должны установить

allow_url_use = Вкл

в вашем php.ini, чтобы остановить получение предупреждений.

Ответ 16

Прежде чем использовать файл_get_contents(), вы должны использовать функцию file_exists(). Таким образом вы избежите предупреждения php.

$file = "path/to/file";

if(file_exists($file)){
  $content = file_get_contents($file);
}