从性能方面考虑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 相关文章推荐
如何给phpadmin一个保护
Oct 09 PHP
session 的生命周期是多长
Oct 09 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
PHP设计模式之代理模式的深入解析
Jun 13 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
php生成图片验证码的实例讲解
Aug 03 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
php解析mht文件转换成html的实例
Mar 13 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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
2016/12/01 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
Django基础之Model操作步骤(介绍)
2017/05/27 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
python如何实现视频转代码视频
2019/06/17 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
小饰品店的创业计划书范文
2013/12/28 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
详解php中流行的rpc框架
2021/05/29 PHP
DE1103使用报告
2022/04/05 无线电
在 Python 中利用 Pool 进行多线程
2022/04/24 Python