Я написал 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: проверьте код возврата: if($content === FALSE) { // handle error here... }
Шаг 2: подавить предупреждение, поставив оператор управления ошибками (т.е. @
) перед вызовом file_get_contents () : $content = @file_get_contents($site);
Вы также можете настроить обработчик ошибок как анонимную функцию, которая вызывает исключение, и использовать 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();
Кажется, что очень много кода, чтобы поймать одну небольшую ошибку, но если вы используете исключения во всем приложении, вам нужно будет сделать это только один раз, вверху (например, в включенном файле конфигурации), и это будет конвертируйте все свои ошибки в Исключения.
Мой любимый способ сделать это довольно просто:
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» может поймать это.
Вы можете добавить @: $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(); }
Вот как я это сделал … Нет необходимости в блоке try-catch … Лучшее решение всегда самое простое … Наслаждайтесь!
$content = @file_get_contents("http://www.google.com"); if (strpos($http_response_header[0], "200")) { echo "SUCCESS"; } else { echo "FAILED"; }
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 }
Вот как я справляюсь с этим:
$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
Вы можете использовать этот скрипт
$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"; }
Поскольку 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; }
Это попытается получить данные, если это не сработает, оно поймает ошибку и позволит вам делать все, что вам нужно в уловке.
try { $content = file_get_contents($site); } catch(\Exception $e) { return 'The file was not found'; }
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); });
Измените файл php.ini
allow_url_fopen = On allow_url_include = On
Вы также должны установить
allow_url_use = Вкл.
в вашем php.ini, чтобы прекратить получать предупреждения.
Прежде чем использовать file_get_contents (), вы должны использовать функцию file_exists (). Таким образом вы избежите предупреждения php.
$file = "path/to/file"; if(file_exists($file)){ $content = file_get_contents($file); }