从性能方面考虑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 相关文章推荐
不用GD库生成当前时间的PNG格式图象的程序
Oct 09 PHP
PHP连接Access数据库的方法小结
Jun 20 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
php自定义hash函数实例
May 05 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
php中Ioc(控制反转)和Di(依赖注入)
May 07 PHP
Yii框架创建cronjob定时任务的方法分析
May 23 PHP
php实现的双色球算法示例
Jun 20 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 PHP
PHP实现微信提现功能(微信商城)
Nov 21 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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
php 数组使用详解 推荐
2011/06/02 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
2019/06/05 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
详解Java中String JSONObject JSONArray List转换
2020/11/13 Javascript
python使用递归解决全排列数字示例
2014/02/11 Python
Python深入学习之内存管理
2014/08/31 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
Python单元测试简单示例
2018/07/03 Python
Python 判断奇数偶数的方法
2018/12/20 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
读书活动实施方案
2014/03/10 职场文书
敬老院活动总结
2014/04/28 职场文书
房产公证委托书范本
2014/09/20 职场文书
工作检讨书500字
2014/10/19 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书