2 php
从 php 大文件下载而不消耗所有服务器内存的最佳方法是什么?
我可以这样做(错误代码):
$url='http://server/bigfile';
$cont = file_get_contents($url);
file_put_contents('./localfile',$cont);
Run Code Online (Sandbox Code Playgroud)
此示例加载条目远程文件$cont,这可能会超出内存限制。
是否有安全功能(可能是内置的)来执行此操作(可能是 stream_*)?
谢谢
您可以使用 curl 和选项 CURLOPT_FILE 将下载的内容直接保存到文件中。
set_time_limit(0);
$fp = fopen ('file', 'w+b');
$ch = curl_init('http://remote_url/file');
curl_setopt($ch, CURLOPT_TIMEOUT, 75);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
Run Code Online (Sandbox Code Playgroud)
这是我下载大文件时使用的功能。它将避免将整个文件加载到缓冲区中。相反,它将在接收字节时写入目标。
function download($file_source, $file_target)
{
$rh = fopen($file_source, 'rb');
$wh = fopen($file_target, 'wb');
if (!$rh || !$wh) {
return false;
}
while (!feof($rh)) {
if (fwrite($wh, fread($rh, 1024)) === FALSE) {
return false;
}
}
fclose($rh);
fclose($wh);
return true;
}
Run Code Online (Sandbox Code Playgroud)