从性能方面考虑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模板技术原理【一】
Jan 10 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
24条货真价实的PHP代码优化技巧
Jul 28 PHP
php解决DOM乱码的方法示例代码
Nov 20 PHP
curl 出现错误的调试方法(必看)
Feb 13 PHP
PHP解耦的三重境界(浅谈服务容器)
Mar 13 PHP
浅析PHP数据导出知识点
Feb 17 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 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输出时间格式
2013/08/31 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python基础之函数用法实例详解
2014/09/10 Python
详解Python中for循环的使用
2015/04/14 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
python的concat等多种用法详解
2018/11/28 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
python打包成so文件过程解析
2019/09/28 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
py-charm延长试用期限实例
2019/12/22 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
python调用百度API实现人脸识别
2020/11/17 Python
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
经济与贸易专业应届生求职信
2013/11/19 职场文书
培训班主持词
2014/03/28 职场文书
研究生求职自荐书
2014/06/23 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书