哪种方法最快将外部文件保存到我的服务器。为什么以及如何?
使用卷曲:
$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");
答案 0 :(得分:0)
它主要取决于协议(例如,如果它是本地文件,则copy()会更快),但是由于您说的是“远程文件”,curl可能会更快。您正在使用CURLOPT_ENCODING
和CURLOPT_FOLLOWLOCATION
,我想这意味着它是通过http传输的,其中curl通常比copy快得多,至少出于以下两个原因:
1:PHP的fopen http包装器不使用压缩,但是在此处将CURLOPT_ENCODING
设置为emptystring时,您告诉curl在可能的情况下使用压缩。 (虽然这取决于libcurl的编译方式,但是gzip
和deflate
压缩通常是使用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";