当前位置: 首页> 最新文章列表> PHP 如何用 file_get_contents 从远程 URL 获取网页内容?一文看懂

PHP 如何用 file_get_contents 从远程 URL 获取网页内容?一文看懂

gitbox 2025-06-09

一、什么是 file_get_contents

file_get_contents 是一个用于将整个文件读入一个字符串中的函数。在处理本地文件时非常方便,但同样适用于远程 HTTP/HTTPS 资源。

语法如下:

string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = 0 [, int $maxlen ]]]] )

其中 $filename 可以是文件路径,也可以是 URL。


二、最基础的用法:获取一个网页内容

我们先来看一个最简单的示例,直接获取一个网页的 HTML 内容:

<?php
$url = "https://gitbox.net/sample-page.html";
$content = file_get_contents($url);
echo $content;
?>

这个例子中,file_get_contents 会发起一个 HTTP GET 请求,获取 https://gitbox.net/sample-page.html 的内容,并将其赋值给 $content。随后,echo 输出网页的 HTML。


三、添加自定义 Header:使用 stream_context_create

有些网站需要特定的请求头部,比如 User-AgentReferer 等。我们可以使用 stream_context_create 创建一个上下文:

<?php
$url = "https://gitbox.net/api/data.json";
$options = [
    "http" => [
        "header" => "User-Agent: PHP\r\n"
    ]
];
$context = stream_context_create($options);
$content = file_get_contents($url, false, $context);
echo $content;
?>

这段代码中,我们模拟了一个浏览器请求,通过设置 User-Agent 来避免被目标服务器拒绝请求。


四、处理 HTTPS 证书验证问题

在使用 file_get_contents 请求 HTTPS 资源时,可能会遇到 SSL 证书验证失败的问题。此时可以通过配置 context 关闭验证(不推荐生产环境使用):

<?php
$url = "https://gitbox.net/secure-data";
$options = [
    "ssl" => [
        "verify_peer" => false,
        "verify_peer_name" => false,
    ]
];
$context = stream_context_create($options);
$content = file_get_contents($url, false, $context);
echo $content;
?>

这种方式适合调试或测试环境,生产环境请使用有效的证书并启用验证。


五、读取失败的处理方式

如果 URL 无效或者请求失败,file_get_contents 会返回 false。可以结合 @ 错误抑制符和 issetempty 做基本判断:

<?php
$url = "https://gitbox.net/invalid-page";
$content = @file_get_contents($url);
if ($content === false) {
    echo "请求失败,无法获取内容。";
} else {
    echo $content;
}
?>

此外,你还可以使用 error_get_last() 获取失败的具体原因,便于调试。


六、与 cURL 的比较

虽然 file_get_contents 使用方便,但在处理复杂的 HTTP 请求(如 POST、cookie、超时控制等)时,cURL 提供了更强大的功能。如果你对请求行为有更多控制需求,建议使用 cURL。但对于简单的 GET 请求,file_get_contents 完全够用。


七、常见问题汇总

  1. allow_url_fopen 为 false 导致不能访问 URL?
    解决方法:修改 php.ini 文件,开启此选项:

    allow_url_fopen = On
    
  2. 出现乱码?
    检查目标页面编码,必要时转换编码:

    $content = mb_convert_encoding($content, 'UTF-8', 'GBK');
    
  3. 无法访问 HTTPS?
    确保 OpenSSL 扩展已开启:

    extension=openssl