从性能方面考虑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部分常见问题总结
Oct 09 PHP
escape unescape的php下的实现方法
Apr 27 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
Session服务器配置指南与使用经验的深入解析
Jun 17 PHP
php通过正则表达式记取数据来读取xml的方法
Mar 09 PHP
简单介绍PHP非阻塞模式
Mar 03 PHP
php进程间通讯实例分析
Jul 11 PHP
php实现36进制与10进制转换功能示例
Jan 10 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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 批量更新网页内容实现代码
2010/01/05 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
PHP查询快递信息的方法
2015/03/07 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python2随机数列生成器简单实例
2017/09/04 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
python列表推导式入门学习解析
2019/12/02 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
应届行政管理专业个人自我评价
2013/12/28 职场文书
广告宣传策划方案
2014/05/21 职场文书
岳麓书院导游词
2015/02/03 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
文员岗位职责范本
2015/04/16 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android