仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 995|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网页编程之让PHP更快的供应文件下载

[复制链接]
跳转到指定楼层
楼主
发表于 2015-2-3 23:31:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
给你的建议是,有些最常用的语句是需要记住的 比如if for while这些、其他的一般语句你只要知道有这个函数或者有这个功能就可以了,当你用的时候你可以凭借记忆搜索就可以了。      普通来讲, 咱们可以经由过程直接让URL指向一个位于Document Root上面的文件, 来引诱用户下载文件.
    然而, 如许做, 就没举措做一些统计, 权限反省, 等等的任务. 因而, 良多时分, 咱们采取让PHP来做转发, 为用户供应文件下载.
   
    <?php
    $file = "/tmp/dummy.tar.gz";
    header("Content-type: application/octet-stream");
    header('Content-Disposition: attachment; filename="' . basename($file) . '"');
    header("Content-Length: ". filesize($file));
    readfile($file);
   
    然而这个有一个成绩, 就是假如文件是中文名的话, 有的用户能够下载后的文件名是乱码.
    因而, 咱们做一下修正(参考: :
   
    <?php
    $file = "/tmp/中文名.tar.gz";
    $filename = basename($file);
    header("Content-type: application/octet-stream");
    //处置中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $encoded_filename = urlencode($filename);
    $encoded_filename = str_replace("+", "%20", $encoded_filename);
    if (preg_match("/MSIE/", $ua)) {
    header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
    } else if (preg_match("/Firefox/", $ua)) {
    header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
    } else {
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    }
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    header("Content-Length: ". filesize($file));
    readfile($file);
   
    恩, 如今看起来很多多少了, 不外还有一个成绩, 那就是readfile, 固然PHP的readfile测验考试完成的尽可能高效, 不占用PHP自己的内存, 然而实践上它仍是需求采取MMAP(假如撑持), 或是一个固定的buffer去轮回读取文件, 直接输入.
    输入的时分, 假如是Apache + PHP mod, 那末还需求发送到Apache的输入缓冲区. 最初才发送给用户. 而关于Nginx + fpm假如他们分隔安排的话, 那还会带来额定的收集IO.
    那末, 能不克不及不经由PHP这层, 直接让Webserver直接把文件发送给用户呢?
    明天, 我看到了一个成心思的文章: How I PHP: X-SendFile.
    咱们可使用Apache的module mod_xsendfile, 让Apache直接发送这个文件给用户:
   
    <?php
    $file = "/tmp/中文名.tar.gz";
    $filename = basename($file);
    header("Content-type: application/octet-stream");
    //处置中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $encoded_filename = urlencode($filename);
    $encoded_filename = str_replace("+", "%20", $encoded_filename);
    if (preg_match("/MSIE/", $ua)) {
    header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
    } else if (preg_match("/Firefox/", $ua)) {
    header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
    } else {
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    }
    header('Content-Disposition: attachment; filename="' . basename($file) . '"');
    //让Xsendfile发送文件
    header("X-Sendfile: $file");
   
    X-Sendfile头将被Apache处置, 而且把呼应的文件直接发送给Client.
    Lighttpd和Nginx也有相似的模块, 人人有乐趣的可以去找找看
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。
金色的骷髅 该用户已被删除
沙发
发表于 2015-2-4 00:26:21 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
飘灵儿 该用户已被删除
板凳
发表于 2015-2-4 00:26:21 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
冷月葬花魂 该用户已被删除
地板
发表于 2015-2-5 14:48:22 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
爱飞 该用户已被删除
5#
发表于 2015-2-9 07:53:49 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
深爱那片海 该用户已被删除
6#
发表于 2015-2-27 04:41:18 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
简单生活 该用户已被删除
7#
发表于 2015-3-5 15:56:20 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
谁可相欹 该用户已被删除
8#
发表于 2015-3-12 09:25:26 | 只看该作者
当然这种网站的会员费就几十块钱。
再现理想 该用户已被删除
9#
发表于 2015-3-22 23:35:57 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
变相怪杰 该用户已被删除
10#
发表于 2015-3-24 07:47:31 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
活着的死人 该用户已被删除
11#
发表于 2015-3-24 10:08:56 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
飘飘悠悠 该用户已被删除
12#
发表于 2015-4-6 04:09:34 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
柔情似水 该用户已被删除
13#
发表于 2015-4-16 16:47:56 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
若相依 该用户已被删除
14#
发表于 2015-4-18 15:33:35 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
老尸 该用户已被删除
15#
发表于 2015-4-21 21:10:43 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
16#
 楼主| 发表于 2015-5-3 06:42:54 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
灵魂腐蚀 该用户已被删除
17#
发表于 2015-6-16 00:54:00 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
乐观 该用户已被删除
18#
发表于 2015-6-23 23:03:58 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
因胸联盟 该用户已被删除
19#
发表于 2015-6-26 20:48:20 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 13:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表