从性能方面考虑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的日期与时间函数技巧
Apr 24 PHP
Ajax PHP简单入门教程代码
Apr 25 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
WordPress伪静态规则设置代码实例
Dec 10 PHP
php访问对象中的成员的实例方法
Nov 17 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/11/27 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
wxPython窗口的继承机制实例分析
2014/09/28 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python中random模块生成随机数详解
2016/03/10 Python
Python中join函数简单代码示例
2018/01/09 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
python跳出双层for循环的解决方法
2019/06/24 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
关于python字符串方法分类详解
2019/08/20 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
python实现一个猜拳游戏
2020/04/05 Python
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
香港通票:Hong Kong Pass
2019/02/26 全球购物
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
小班评语大全
2014/05/04 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang