从性能方面考虑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 模拟登陆MSN并获得用户信息
May 16 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
Dec 18 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
PHP中多维数组的foreach遍历示例
Jun 13 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
PHP registerXPathNamespace()函数讲解
Feb 03 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 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中的global
2014/08/19 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
2015/04/12 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Python3 中文文件读写方法
2018/01/23 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
python plotly绘制直方图实例详解
2019/07/22 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
Python如何执行系统命令
2020/09/23 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
财务管理专业应届毕业生求职信
2013/09/22 职场文书
考试不及格检讨书
2014/01/09 职场文书
项目采购员岗位职责
2014/04/15 职场文书
怎么写工作检讨书
2014/11/16 职场文书
教师岗位职责范本
2015/04/02 职场文书
教师培训学习心得体会
2016/01/21 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技