我写了这样的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
但是没有用。
我写了这样的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
但是没有用。
Answers:
步骤1:检查返回码: if($content === FALSE) { // handle error here... }
步骤2:通过在调用file_get_contents()的前面放置错误控制运算符(即@
)来抑制警告:
$content = @file_get_contents($site);
@
以免使用会对性能产生负面影响。请在相关的帖子中看到此答案,该帖子解释得很好。
您还可以将错误处理程序设置为调用Exception的匿名函数,并对该异常使用try / catch。
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,因此可以使用简单的“ if”来捕获该错误。
@file_get_contents
阻止向浏览器报告错误。
@file_get_contents
抑制警告并使用来测试结果值=== FALSE
。
if (false !== ($data = file_get_contents ()))
error_get_last
我的经验,使用@可能不会返回任何内容
一种选择是抑制错误,并引发异常,以后可以捕获该异常。如果您的代码中有多个对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";
}
$http_response_header
在这种情况下不会更新,因为没有收到HTTP响应。
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
}
$url
找不到404,则仍会出现警告。
ignore_errors
仅指示HTTP上下文不将HTTP响应状态代码> = 400解释为错误。虽然关系不大,但这不能解决PHP错误处理的问题。
ignore_errors
选择!这就是我所需要的!
最好的办法是设置您自己的错误和异常处理程序,这将做一些有用的事情,例如将其记录在文件中或通过电子邮件发送给关键文件。 http://www.php.net/set_error_handler
由于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;
}
最简单的方法是在file_get_contents之前加一个@。e .:
$content = @file_get_contents($site);
像这样的东西:
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()之前,应先使用file_exists()函数。通过这种方式,您将避免php警告。
$file = "path/to/file";
if(file_exists($file)){
$content = file_get_contents($file);
}
更改文件php.ini
allow_url_fopen = On
allow_url_include = On
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);
});