如何在file_get_contents()中处理403错误?

时间:2017-01-23 08:40:11

标签: php error-handling

使用file_get_contents()

时,我收到403错误

我想像这样处理这个错误,

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错误,脚本就不会崩溃。

任何想法?

请帮忙,我是编程新手。非常感谢。

2 个答案:

答案 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;