复制vs卷曲以将外部文件保存在我的服务器上

时间:2018-08-08 09:59:54

标签: php file 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");

1 个答案:

答案 0 :(得分:0)

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

1:PHP的fopen http包装器不使用压缩,但是在此处将CURLOPT_ENCODING设置为emptystring时,您告诉curl在可能的情况下使用压缩。 (虽然这取决于libcurl的编译方式,但是gzipdeflate压缩通常是使用libcurl编译的。)

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

但是唯一可以肯定地知道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";

vs

$starttime=microtime(true);
copy($extFile, "report.csv");
echo "used ".(microtime(true)-$starttime)." seconds.\n";
  • 为您提供大约微秒的精度(IEEE 754双浮点精度可能会稍微破坏它,但可能不足以解决问题。)