从性能方面考虑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中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
php数字游戏 计算24算法
Jun 10 PHP
如何使用Strace调试工具
Jun 03 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
ThinkPHP独立分组使用的注意事项
Nov 25 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
Dec 22 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
php计算title标题相似比的方法
Jul 29 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 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
更改localhost为其他名字的方法
2014/02/10 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
pygame播放音乐的方法
2015/05/19 Python
Python 正则表达式的高级用法
2016/12/04 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
项目计划书范文
2014/01/09 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
高中语文课后反思
2014/04/27 职场文书
校长竞聘演讲稿
2014/05/16 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
Apache Hudi数据布局黑科技降低一半查询时间
2022/03/31 Servers