首页 > 解决方案 > 复制 vs Curl 将外部文件保存在我的服务器上

问题描述

哪种方式将外部文件保存到我的服务器最快。为什么以及如何?

使用卷曲:

$ch = curl_init();
$fp = fopen ($local_file, 'w+');
$ch = curl_init($remote_file);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_exec($ch);
curl_close($ch);
fclose($fp);

使用复制:

copy($extFile, "report.csv");

标签: phpfilecurl

解决方案


它主要取决于协议(例如,如果它是本地文件,则 copy() 会更快),但是由于您说的是“远程文件”,因此 curl 可能会更快。您正在使用CURLOPT_ENCODINGand CURLOPT_FOLLOWLOCATION,我想这意味着它是通过 http 传输的,其中 curl 通常比复制快得多,至少有两个原因:

1:PHP 的 fopen http 包装器不使用压缩,但是当您CURLOPT_ENCODING在此处设置为空字符串时,您会告诉 curl 尽可能使用压缩。(虽然这取决于 libcurl 的编译方式,gzip并且deflate压缩通常使用 libcurl 编译。)

2:copy() 一直从套接字读取,直到远程服务器关闭连接,这可能比文件完全下载时晚得多。同时,curl 只会读取到它读取等于Content-Length:-http 标头的字节,然后关闭连接本身,这通常比在远程服务器关闭连接之前停止 read() 快得多(copy() 会这样做,但是curl_exec() 没有。)

但唯一能确定 ofc 的方法是 TIAS。

$starttime=microtime(true);
$ch = curl_init();
$fp = fopen ($local_file, 'w+');
$ch = curl_init($remote_file);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_exec($ch);
curl_close($ch);
fclose($fp);
echo "used ".(microtime(true)-$starttime)." seconds.\n";

对比

$starttime=microtime(true);
copy($extFile, "report.csv");
echo "used ".(microtime(true)-$starttime)." seconds.\n";
  • 给你大约微秒的精度(IEEE 754 双浮点精度可能会在某种程度上破坏它,但可能还不够重要。)

推荐阅读