在PHP开发中,获取远程服务器上的文件并保存到本地是常见的需求,比如同步第三方平台的资源、备份远程数据等场景都会用到。实现这个功能主要有两种常用的方案,分别是基于curl扩展和file_get_contents函数,下面分别介绍具体的实现方式。

方案一:使用curl扩展下载远程文件
curl是PHP中处理网络请求的常用扩展,支持多种协议,稳定性好,功能也更全面,是下载远程文件的首选方案。
实现步骤
- 初始化curl会话
- 设置远程文件的URL地址
- 配置curl选项,比如设置超时时间、返回响应数据等
- 执行请求获取远程文件内容
- 将内容写入本地文件
- 关闭curl会话释放资源
完整代码示例
<?php
/**
* 使用curl下载远程文件
* @param string $remoteUrl 远程文件URL
* @param string $localPath 本地保存路径
* @return bool 下载是否成功
*/
function downloadFileByCurl($remoteUrl, $localPath) {
// 初始化curl
$ch = curl_init();
// 设置远程URL
curl_setopt($ch, CURLOPT_URL, $remoteUrl);
// 设置超时时间 10秒
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 设置不直接输出响应内容
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 忽略SSL证书验证(如果是https地址且证书有问题可开启)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 执行请求获取内容
$fileContent = curl_exec($ch);
// 获取请求错误信息
$error = curl_error($ch);
// 关闭curl
curl_close($ch);
// 如果有错误返回失败
if ($error) {
return false;
}
// 打开本地文件准备写入
$fp = fopen($localPath, 'w');
if (!$fp) {
return false;
}
// 写入文件内容
fwrite($fp, $fileContent);
fclose($fp);
return true;
}
// 调用示例
$remoteUrl = 'http://ipipp.com/test.txt';
$localPath = './download/test.txt';
// 确保保存目录存在
if (!is_dir('./download')) {
mkdir('./download', 0777, true);
}
$result = downloadFileByCurl($remoteUrl, $localPath);
if ($result) {
echo '文件下载成功,保存路径:' . $localPath;
} else {
echo '文件下载失败';
}
?>
方案二:使用file_get_contents函数下载远程文件
file_get_contents是PHP内置的文件读取函数,也可以用来获取远程文件内容,使用起来更简单,但是功能相对有限,适合简单的下载场景。
注意事项
使用这个方法之前需要确认PHP配置中allow_url_fopen选项是开启状态,否则无法访问远程URL。可以在php.ini中设置allow_url_fopen = On,或者通过ini_set('allow_url_fopen', 'On')临时开启。
完整代码示例
<?php
/**
* 使用file_get_contents下载远程文件
* @param string $remoteUrl 远程文件URL
* @param string $localPath 本地保存路径
* @return bool 下载是否成功
*/
function downloadFileByFileGetContents($remoteUrl, $localPath) {
// 获取远程文件内容
$fileContent = file_get_contents($remoteUrl);
// 如果获取失败返回false
if ($fileContent === false) {
return false;
}
// 写入本地文件
$result = file_put_contents($localPath, $fileContent);
return $result !== false;
}
// 调用示例
$remoteUrl = 'http://ipipp.com/test.jpg';
$localPath = './download/test.jpg';
// 确保保存目录存在
if (!is_dir('./download')) {
mkdir('./download', 0777, true);
}
$result = downloadFileByFileGetContents($remoteUrl, $localPath);
if ($result) {
echo '文件下载成功,保存路径:' . $localPath;
} else {
echo '文件下载失败';
}
?>
两种方案对比
我们可以通过下面的表格直观对比两种方案的差异:
| 对比项 | curl方案 | file_get_contents方案 |
|---|---|---|
| 依赖条件 | 需要安装curl扩展 | 需要开启allow_url_fopen配置 |
| 功能丰富度 | 支持设置超时、自定义请求头、处理https等 | 功能简单,仅能获取基础内容 |
| 稳定性 | 高,适合生产环境 | 一般,网络波动时容易失败 |
| 使用复杂度 | 代码稍多,步骤较多 | 代码简洁,几行即可实现 |
常见问题说明
- 下载大文件时建议分块读取写入,避免一次性占用过多内存,curl可以通过
CURLOPT_RANGE设置分块请求,file_get_contents可以配合stream_context_create设置读取长度。 - 保存文件的目录需要有写入权限,否则会写入失败,可以通过
chmod命令修改目录权限。 - 如果下载https协议的远程文件,curl方案可以通过配置SSL相关选项处理证书问题,file_get_contents方案需要关闭SSL验证才能正常访问。
PHPcurlfile_get_contents远程文件下载修改时间:2026-06-21 04:30:36