使用file_get_contents()
,
我想像这样处理这个错误,
if(required_function(file_get_contents($url))){ //detects there is a 403
error
// do some special set of tasks
}else{
//run normally
}
我尝试读取错误,因为当我在浏览器中粘贴时,网址显示错误,但是没有进入file_get_contents()
,所以我失败了。我不认为更改用户代理会起作用,因为系统仍然可以检测到这是一个脚本,所以我意识到如果我能检测到403错误,脚本就不会崩溃。
任何想法?
请帮忙,我是编程新手。非常感谢。
答案 0 :(得分:2)
我个人建议您使用cURL而不是file_get_contents。 file_get_contents非常适合面向基本内容的GET请求。但是标头,HTTP请求方法,超时,重定向和其他重要的事情并不重要。
然而,要检测状态代码(403,200,500等),您可以使用 get_headers()调用或 $ http_response_header 自动分配的变量。
$ http_response_header 是一个预定义变量,它会在每次 file_get_contents 调用时更新。
以下代码可能会直接为您提供状态代码(403,200等)。
preg_match( "#HTTP/[0-9\.]+\s+([0-9]+)#", $http_response_header[0], $match);
$statusCode = intval($match[1]);
有关变量的更多信息和内容,请查看官方文档
$http_response_header — HTTP response headers
get_headers — Fetches all the headers sent by the server in response to a HTTP request
(更好的选择)cURL
警告 $ http_response_header, (from php.net)
请注意,HTTP包装器很难 标题行限制为1024个字符。收到的任何长于此的HTTP标头都将被忽略,并且不会出现在$ http_response_header中。 cURL扩展没有此限制。
答案 1 :(得分:1)
我刚遇到类似的问题并解决了它。我的解决方案涵盖了更多案例:
问:如何在PHP中进行POST,而不是使用cURL?
答:使用file_get_contents()。
问:如何让file_get_contents()不要抱错HTTP状态?
答:在传递给file_get_contents()的选项中设置ingore_errors => TRUE。
问:如何在响应中检索http状态?
答:在调用file_get_contents()之后,评估$ http_response_header
问:即使出现错误的http响应代码,如何检索响应体?
答:设置ignore_errors => TRUE,file_get_contents()将返回正文。
以下是代码示例:
$reqBody = '{"description":"test"}';
$opts = array('http' =>
array(
'method' => 'POST',
'header' => "Content-Type: application/json\r\n",
'ignore_errors' => TRUE,
'content' => $reqBody
)
);
$context = stream_context_create($opts);
$url = 'http://mysite';
// with ignore_errors=true, file_get_contents() won't complain
$respBody = file_get_contents($url, false, $context);
// evaluate the response header, the way you want.
// In particular it contains http status code for response
var_dump($http_response_header);
// with ignore_errors=true, you get respBody even for bad http response code
echo $respBody;