file_get_contents 报错问题详解
file_get_contents() 是 PHP 中用于将文件内容读入字符串的常用函数,在实际开发过程中,使用该函数时可能会遇到各种错误和问题,本文将详细探讨这些问题及其解决方案,并提供相关的示例和代码。

常见报错及原因
1、SSL 证书验证失败:在使用 file_get_contents() 请求 HTTPS URL 时,如果服务器未正确配置 SSL 证书,可能会导致 SSL 验证失败。
2、URL 重写问题:file_get_contents() 在处理域名 URL 时可能会出现重写问题,导致无法获取内容。
3、编码问题:当抓取开启 Gzip 压缩的网页时,可能会导致乱码问题。
4、权限问题:尝试读取本地文件或远程文件时,文件权限不足可能导致无法读取。
5、超时问题:网络请求超时也会导致 file_get_contents() 失败。
解决方法
方法一:解决 SSL 证书验证失败

下载并配置 CA 证书:将 CA 证书下载到服务器并配置 php.ini 文件中的 openssl.cafile 选项。
- // 下载 CA 证书
- $certificate = "http://curl.haxx.se/ca/cacert.pem";
- file_put_contents("/etc/ssl/certs/cacert.pem", file_get_contents($certificate));
- // 修改 php.ini 文件
- openssl.cafile = "/etc/ssl/certs/cacert.pem"
重启 PHP 服务后生效。
方法二:使用 cURL 替代 file_get_contents
由于 file_get_contents() 在处理 HTTPS 和复杂请求时存在诸多限制,建议使用 cURL 函数。
- function getSSLPage($url) {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_SSLVERSION, 3);
- $result = curl_exec($ch);
- curl_close($ch);
- return $result;
- }
- $content = getSSLPage("https://example.com");
- echo $content;
方法三:跳过 SSL 验证(不推荐)
在开发环境中,可以临时跳过 SSL 验证,但在生产环境中应避免这种做法。

- $stream_opts = [
- "ssl" => [
- "verify_peer"=>false,
- "verify_peer_name"=>false,
- ]
- ];
- $response = file_get_contents("https://example.com", false, stream_context_create($stream_opts));
- echo $response;
方法四:解决编码问题
使用 zlib 库解压 Gzip 内容:如果目标页面开启了 Gzip 压缩,可以使用以下方法。
- $data = file_get_contents("compress.zlib://https://example.com");
- echo $data;
使用 cURL 设置解码选项:
- function curl_get($url, $gzip=false){
- $curl = curl_init($url);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
- if($gzip) curl_setopt($curl, CURLOPT_ENCODING, 'gzip');
- $content = curl_exec($curl);
- curl_close($curl);
- return $content;
- }
- $content = curl_get("https://example.com", true);
- echo $content;
方法五:处理域名 URL 重写问题
设置 UserAgent:在某些情况下,设置 UserAgent 可以避免域名 URL 重写问题。
- $opts = array('http'=>array('header' => "UserAgent:MyAgent/1.0\r
- "));
- $context = stream_context_create($opts);
- $header = file_get_contents('http://www.example.com/faq.jsp',false,$context);
- echo $header;
file_get_contents() 虽然是一个常用的读取文件内容的函数,但在处理 HTTPS、Gzip 压缩、域名解析等问题时存在一定的局限性,通过合理配置和使用 cURL 函数,可以有效解决这些问题,提高代码的稳定性和可维护性。
相关问答 FAQs
Q1: 为什么 file_get_contents() 在请求 HTTPS URL 时会报 SSL 错误?
A1: file_get_contents() 在请求 HTTPS URL 时,如果服务器未正确配置 SSL 证书,会导致 SSL 验证失败,可以通过下载并配置 CA 证书,或者使用 cURL 函数来解决这个问题。
Q2: 如何解决 file_get_contents() 抓取 Gzip 压缩网页时的乱码问题?
A2: 可以通过使用 zlib 库解压 Gzip 内容,或者使用 cURL 函数设置解码选项来解决抓取 Gzip 压缩网页时的乱码问题。