从性能方面考虑PHP下载远程文件的3种方法


Posted in PHP onDecember 29, 2015

今天在做导出Excel的时候,总是要测试导出的Excel文件,频繁的下载和打开,很麻烦就想着写段代码一气呵成  服务端导出Excel==>下载Excel文件到本地==>并打开的操作。

这里摘出PHP下载远端文件的方案,以备忘。其中第3种方法考虑到文件过大时的性能问题。

3种方案:

-rw-rw-r-- 1 liuyuan liuyuan 470 Feb 20 18:12 test1_fopen.php
-rw-rw-r-- 1 liuyuan liuyuan 541 Feb 20 18:06 test2_curl.php
-rw-rw-r-- 1 liuyuan liuyuan 547 Feb 20 18:12 test3_curl_better.php

方案1,适用于小文件

直接使用fopen()/file_get_contents()获取文件流并用file_put_contents()写入

<?php
  //an example xls file form baidu wenku
  $url = 'http://bs.baidu.com/wenku4/%2Fe43e6732eba84a316af36c5c67a7c6d6?sign=MBOT:y1jXjmMD4FchJHFHIGN4z:lfZAx1Nrf44aCyD6tJqJ2FhosLY%3D&time=1392893977&response-content-disposition=attachment;%20filename=%22php%BA%AF%CA%FD.xls%22&response-content-type=application%2foctet-stream';
  $fp_input = fopen($url, 'r');
  file_put_contents('./test.xls', $fp_input);
  exec("libreoffice ./test.xls", $out, $status);
?>

方案2:通过Curl获取内容

<?php
  //an example xls file form baidu wenku
  $url = 'http://bs.baidu.com/wenku4/%2Fe43e6732eba84a316af36c5c67a7c6d6?sign=MBOT:y1jXjmMD4FchJHFHIGN4z:lfZAx1Nrf44aCyD6tJqJ2FhosLY%3D&time=1392893977&response-content-disposition=attachment;%20filename=%22php%BA%AF%CA%FD.xls%22&response-content-type=application%2foctet-stream';
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  file_put_contents('./test.xls', curl_exec($ch));
  curl_close($ch);
  exec("libreoffice ./test.xls", $out, $status);
?>

第1,2种方案存在一个问题,就是在写入本地磁盘之前,文件会被读入内存中,那么当文件很大的时候,可能会超出内存而崩溃

即使你的内存设置的足够的大,那这也是不别要的开销

解决方法是:直接给CURL一个可写的文件流来让它自己来解决这个问题(通过 CURLOPT_FILE选项),这样就要先创建一个文件指针给它。

<?php
  //an example xls file form baidu wenku
  $url = 'http://bs.baidu.com/wenku4/%2Fe43e6732eba84a316af36c5c67a7c6d6?sign=MBOT:y1jXjmMD4FchJHFHIGN4z:lfZAx1Nrf44aCyD6tJqJ2FhosLY%3D&time=1392893977&response-content-disposition=attachment;%20filename=%22php%BA%AF%CA%FD.xls%22&response-content-type=application%2foctet-stream';
  $fp_output = fopen('./test.xls', 'w');
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_FILE, $fp_output);
  curl_exec($ch);
  curl_close($ch);
  exec("libreoffice ./test.xls", $out, $status);
?>

 以上内容给大家介绍了从性能方面考虑PHP下载远程文件的3种方法,希望大家喜欢。

PHP 相关文章推荐
复杂检索数据并分页显示的处理方法
Oct 09 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP多个版本的分析解释
Jul 21 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
有道搜索和IP138的IP的API接口(PHP应用)
Nov 29 PHP
PHP中的日期加减方法示例
Aug 21 PHP
Yii2使用自带的UploadedFile实现的文件上传
Jun 20 PHP
php版微信公众号接口实现发红包的方法
Oct 14 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
Mar 31 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
Aug 03 PHP
设定php简写功能的方法
Nov 28 PHP
Yii快速入门经典教程
Dec 28 #PHP
WordPress主题制作之模板文件的引入方法
Dec 28 #PHP
WordPress的主题编写中获取头部模板和底部模板
Dec 28 #PHP
YiiFramework入门知识点总结(图文教程)
Dec 28 #PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 #PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 #PHP
YII使用url组件美化管理的方法
Dec 28 #PHP
You might like
十天学会php之第十天
2006/10/09 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
JavaScript的目的分析
2007/01/05 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
jQuery简单实现网页选项卡特效
2014/11/24 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
python实现的简单抽奖系统实例
2015/05/22 Python
浅析使用Python操作文件
2017/07/31 Python
Python内建模块struct实例详解
2018/02/02 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
Python list运算操作代码实例解析
2020/01/20 Python
python画图常规设置方式
2020/03/05 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
Python如何实现单例模式
2016/06/03 面试题
应聘护士自荐信
2013/10/21 职场文书
皮肤科医师岗位职责
2013/12/04 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
食品安全宣传标语
2014/06/07 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis