仓酷云

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

[学习教程] PHP网站制作之让 PHP 更快的供应文件下载

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:31:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。      普通来讲, 咱们可以经由过程直接让URL指向一个位于Document Root上面的文件, 来引诱用户下载文件.
    然而, 如许做, 就没举措做一些统计, 权限反省, 等等的任务. 因而, 良多时分, 咱们采取让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);
    然而这个有一个成绩, 就是假如文件是中文名的话, 有的用户能够下载后的文件名是乱码.
    因而, 咱们做一下修正(参考: :
    
    $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);
    输入的时分, 假如是Apache + PHP mod, 那末还需求发送到Apache的输入缓冲区. 最初才发送给用户. 而关于Nginx + fpm假如他们分隔安排的话, 那还会带来额定的收集IO.
    恩, 如今看起来很多多少了, 不外还有一个成绩, 那就是readfile, 固然PHP的readfile测验考试完成的尽可能高效, 不占用PHP自己的内存, 然而实践上它仍是需求采取MMAP(假如撑持), 或是一个固定的buffer去轮回读取文件, 直接输入.
    那末, 能不克不及不经由PHP这层, 直接让Webserver直接把文件发送给用户呢?
    明天, 我看到了一个成心思的文章: How I PHP: X-SendFile.
    咱们可使用Apache的module mod_xsendfile, 让Apache直接发送这个文件给用户:
    
    $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");
    Lighttpd和Nginx也有相似的模块, 人人有乐趣的可以去找找看
    X-Sendfile头将被Apache处置, 而且把呼应的文件直接发送给Client.
总的来说,在这一个月左右的时间中,学到的不少,但是也遇到不少的问题,比如批量图片的上传,一直到现在也不懂,如何实现动态的增加上传图片的数量。
再现理想 该用户已被删除
沙发
发表于 2015-2-4 01:18:47 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
爱飞 该用户已被删除
板凳
发表于 2015-2-7 11:02:44 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
活着的死人 该用户已被删除
地板
发表于 2015-2-11 12:50:37 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
老尸 该用户已被删除
5#
发表于 2015-3-2 12:22:16 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
金色的骷髅 该用户已被删除
6#
发表于 2015-3-11 03:30:41 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-17 19:11:05 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
深爱那片海 该用户已被删除
8#
发表于 2015-3-20 03:13:52 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
若相依 该用户已被删除
9#
发表于 2015-3-20 17:25:18 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
admin 该用户已被删除
10#
发表于 2015-3-20 23:43:29 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
再见西城 该用户已被删除
11#
发表于 2015-3-23 23:46:44 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
不帅 该用户已被删除
12#
发表于 2015-4-13 07:56:22 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
小魔女 该用户已被删除
13#
发表于 2015-4-17 10:20:06 | 只看该作者
当然这种网站的会员费就几十块钱。
海妖 该用户已被删除
14#
发表于 2015-4-18 12:46:35 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
精灵巫婆 该用户已被删除
15#
发表于 2015-4-23 08:07:03 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
小女巫 该用户已被删除
16#
发表于 2015-5-6 17:13:32 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
第二个灵魂 该用户已被删除
17#
发表于 2015-6-14 20:42:03 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
莫相离 该用户已被删除
18#
发表于 2015-6-27 05:53:45 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
谁可相欹 该用户已被删除
19#
发表于 2015-6-27 22:42:42 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
柔情似水 该用户已被删除
20#
发表于 2015-7-4 04:37:46 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 08:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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