从性能方面考虑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版)
Oct 09 PHP
用Zend Encode编写开发PHP程序
Oct 09 PHP
PHP VS ASP
Oct 09 PHP
对Session和Cookie的区分与解释
Mar 16 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
单点登录 Ucenter示例分析
Oct 29 PHP
19个超实用的PHP代码片段
Mar 14 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
php 三元运算符实例详细介绍
Dec 15 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 PHP
PHP7移除的扩展和SAPI
Mar 09 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基于XMLWriter操作xml的方法分析
2017/07/17 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
JavaScript编程中实现对象封装特性的实例讲解
2016/06/24 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
python如何快速拼接字符串
2020/10/28 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
护理不良事件检讨书
2014/02/06 职场文书
操行评语大全
2014/04/30 职场文书
记账会计岗位职责
2014/06/16 职场文书
党员作风建设自查报告
2014/10/23 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
教师求职简历自我评价
2015/03/10 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python