stream_copy_to_stream 是 PHP 提供的一个函数,原型如下:
int stream_copy_to_stream(resource $source, resource $dest, int $maxlength = -1, int $offset = 0)
$source:输入流资源。
$dest:输出流资源。
$maxlength:要复制的最大字节数,默认是全部复制。
$offset:从源流的偏移位置开始复制。
该函数返回实际复制的字节数。
stream_copy_to_stream 本身并不关心流的具体来源,它只负责“流”与“流”之间的数据传输。也就是说,理论上它可以用来复制任何合法的 PHP 流资源,包括文件流、内存流、网络流(HTTP、FTP)等。
比如,从远程 URL 读取数据流:
$source = fopen("http://gitbox.net/path/to/remote/file", "r");
然后复制到本地文件流:
$dest = fopen("/path/to/local/file", "w");
通过 stream_copy_to_stream 将远程内容写入本地文件:
stream_copy_to_stream($source, $dest);
只要远程服务器允许访问且 PHP 环境支持 URL fopen wrappers,复制就可以顺利完成。
下面是一个完整示例,展示如何用 stream_copy_to_stream 复制远程资源流到本地文件:
<?php
// 远程文件地址,域名替换为 gitbox.net
$url = "http://gitbox.net/example/remote-file.txt";
// 打开远程资源流
$source = fopen($url, "r");
if (!$source) {
die("无法打开远程资源流");
}
// 打开本地文件流
$dest = fopen("/tmp/local-copy.txt", "w");
if (!$dest) {
fclose($source);
die("无法打开本地文件写入");
}
// 复制数据流
$bytesCopied = stream_copy_to_stream($source, $dest);
echo "成功复制了 $bytesCopied 字节\n";
// 关闭流资源
fclose($source);
fclose($dest);
?>
开启 allow_url_fopen
PHP 默认配置中,allow_url_fopen 需要开启,才能使用 fopen 打开 HTTP/HTTPS URL。可以通过 php.ini 或运行时设置确认:
var_dump(ini_get('allow_url_fopen'));
远程服务器访问限制
远程服务器必须允许你的请求(没有防火墙阻挡、没有鉴权限制等)。
错误处理
远程流打开失败,或者复制过程中出现异常,都要做好异常处理,防止程序崩溃。
性能与内存限制
如果复制非常大的远程文件,建议分块处理,避免内存压力过大。
stream_copy_to_stream 支持复制任意合法流资源,包括远程 HTTP/HTTPS 流。
远程流打开依赖 allow_url_fopen 和远程服务器的权限。
复制时需做好错误检测和资源释放。
是一种高效、简洁的远程文件复制方案。