php - 复制 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");
解决方案
它主要取决于协议(例如,如果它是本地文件,则 copy() 会更快),但是由于您说的是“远程文件”,因此 curl 可能会更快。您正在使用CURLOPT_ENCODING
and 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 双浮点精度可能会在某种程度上破坏它,但可能还不够重要。)
推荐阅读
- java - @Autowired 在类实例使用反射创建的类中不起作用
- javascript - 事件移动X和触摸增量
- angular - Angular 7 - 从服务器下载传入文件
- javascript - Service Worker 可以预缓存 MySQL 数据库吗?
- c# - Visual Studio - 文件打开和关闭动作触发器
- javascript - 为什么我的文件 app.component.html 没有在 Angular7 中显示路由?
- javascript - 将同一组 jQuery 方法和代码应用于多个元素
- java - 即使我尝试了 SQL 中的代码,我在 WHERE 子句中也遇到了错误
- java - void 和 int 类型的方法的结果相同,使用哪个?
- google-sheets - 字符计数后设置回车