从性能方面考虑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学习 运算符与运算符优先级
Jun 15 PHP
php GD绘制24小时柱状图
Jun 28 PHP
PHP n个不重复的随机数生成代码
Jun 23 PHP
如何使用PHP实现javascript的escape和unescape函数
Jun 29 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
php操作XML、读取数据和写入数据的实现代码
Aug 15 PHP
php中fsockopen用法实例
Jan 05 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 PHP
php+mysql+jquery实现日历签到功能
Feb 27 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 PHP
微信小程序发送订阅消息的方法(php 为例)
Oct 30 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中用数组的方法设置cookies
2011/04/21 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
python实现简单的计时器功能函数
2015/03/14 Python
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
几道Java和数据库的面试题
2013/05/30 面试题
营业员个人总结的自我评价
2013/10/25 职场文书
岗位职责的含义
2013/11/17 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
学生病假条范文
2015/08/17 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers