从性能方面考虑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的access操作类
Apr 09 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
微信支付开发教程(一)微信支付URL配置
May 28 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
php中动态调用函数的方法
Mar 16 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
php获取远程文件的内容和大小
Nov 03 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
php微信公众号开发之快递查询
Oct 20 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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
Look And Say 序列php实现代码
2011/05/22 PHP
php共享内存段示例分享
2014/01/20 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
激活 ActiveX 控件
2006/10/09 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
理解Python中函数的参数
2015/04/27 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
工作证明书
2015/06/15 职场文书
班主任寄语2016
2015/12/04 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server