Как я могу обработать предупреждение функции 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 но это не сработало.

22 ответа

Решение

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

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

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

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

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

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

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 при ошибке, поэтому простое "если" может это уловить.

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

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

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

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

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

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

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

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

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

Что -то вроде этого:

public function get($curl,$options){
    $context = stream_context_create($options);
    $file = @file_get_contents($curl, false, $context);
    $str1=$str2=$status=null;
    sscanf($http_response_header[0] ,'%s %d %s', $str1,$status, $str2);
    if($status==200)
        return $file        
    else 
        throw new \Exception($http_response_header[0]);
}

Простейший способ сделать это - просто добавить @ перед file_get_contents, т.е.

$content = @file_get_contents($site); 

Начиная с 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;
}

Вы могли бы использовать этот скрипт

$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";
}
if (!file_get_contents($data)) {
  exit('<h1>ERROR MESSAGE</h1>');
} else {
      return file_get_contents($data);
}

Включите allow_url_fopen из cPanel или WHM, затем попробуйте, надеюсь, это исправит

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

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

Здесь множество ответов, и ничего не работает должным образом. Если вы подавите file_get_contents с @ вы получите NULL и неfalse как утверждали некоторые пользователи. Итак, вы должны сделать это:

$request = @file_get_contents = ...
if (empty($request)) {
    echo 'Connection error occurred...';
}

Я решил все проблемы, все ссылки работают

      public function getTitle($url)
    {
        try {
            if (strpos($url, 'www.youtube.com/watch') !== false) {
                $apikey = 'AIzaSyCPeA3MlMPeT1CU18NHfJawWAx18VoowOY';
                $videoId = explode('&', explode("=", $url)[1])[0];
                $url = 'https://www.googleapis.com/youtube/v3/videos?id=' . $videoId . '&key=' . $apikey . '&part=snippet';

                $ch = curl_init();

                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                curl_setopt($ch, CURLOPT_VERBOSE, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                $response = curl_exec($ch);
                curl_close($ch);

                $data = json_decode($response);
                $value = json_decode(json_encode($data), true);

                $title = $value['items'][0]['snippet']['title'];
            } else {
                set_error_handler(
                    function () {
                            return false;
                    }
                );
                if (($str = file_get_contents($url)) === false) {
                    $title = $url;
                } else {
                    preg_match("/\<title\>(.*)\<\/title\>/i", $str, $title);
                    $title = $title[1];
                    if (preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $title))
                        $title = utf8_encode($title);
                    $title = html_entity_decode($title);
                }
                restore_error_handler();
            }
        } catch (Exception $e) {
            $title = $url;
        }
        return $title;
    }

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

$file = "path/to/file";

if(file_exists($file)){
  $content = file_get_contents($file);
}
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);
});

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

allow_url_use = On 

в вашем php.ini прекратить получать предупреждения.

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

allow_url_fopen = On

allow_url_include = On
Другие вопросы по тегам