从性能方面考虑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 相关文章推荐
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
PHP小程序自动提交到自助友情连接
Nov 24 PHP
php下使用curl模拟用户登陆的代码
Sep 10 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
Jun 10 PHP
PHP实现利用MySQL保存session的方法
Aug 23 PHP
PHP分页类集锦
Nov 18 PHP
php实现点击可刷新验证码
Nov 07 PHP
PHP文件缓存smarty模板应用实例分析
Feb 26 PHP
php常用图片处理类
Mar 16 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 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
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
php的一个简单加密解密代码
2014/01/14 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
javascript数据类型详解
2017/02/07 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
axios的拦截请求与响应方法
2018/08/11 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
进一步探究Python中的正则表达式
2015/04/28 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
Python几种常见算法汇总
2020/06/02 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
学生就业推荐信
2013/11/13 职场文书
项目专员岗位职责
2013/12/04 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
幼儿园六一主持词
2015/06/30 职场文书