从性能方面考虑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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
检测png图片是否完整的php代码
Sep 06 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
深入解析PHP中逗号与点号的区别
Aug 05 PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
Nov 19 PHP
ZF框架实现发送邮件的方法
Dec 03 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
php7 安装yar 生成docker镜像
May 09 PHP
PHP单元测试框架PHPUnit用法详解
Jan 23 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 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
php4的session功能评述(三)
2006/10/09 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
JS实现图片切换效果
2018/11/17 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
JS实现小星星特效
2019/12/24 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
简单实现python爬虫功能
2015/12/31 Python
python编写Logistic逻辑回归
2020/12/30 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
保安员岗位职责
2013/11/17 职场文书
电子商务专业推荐信范文
2013/12/02 职场文书
法学专业毕业生自荐信范文
2013/12/18 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
医院合作意向书范本
2015/05/08 职场文书
MySQL GTID复制的具体使用
2022/05/20 MySQL