1
Archangel_SDY 2014-01-15 11:51:37 +08:00
又没硬盘又没内存又发不出去,那我觉得你只能下载的时候限速了。
|
2
chsola OP @Archangel_SDY 并不是完全没有内存,我的小服内存只有16G,下载文件堆积多了爆内存内存再大内存也受不了.
下载到硬盘再发送让用户等太慢,我想做到像uhacks那种即时发送 |
3
Archangel_SDY 2014-01-15 12:05:04 +08:00
@chsola 那我觉得放内存里也没太大问题,弄个队列控制下任务数吧。
|
4
shiny 2014-01-15 12:09:14 +08:00
试试 sendfile + proxy ? php 里只要 header 下
http://serverfault.com/questions/425328/send-nginx-x-accel-redirect-request-from-remote-server |
5
chsola OP @shiny 关键是我需要实现即时的转发,就像http://u-hacks.net/accountboerse.php这个一样
那种方法无法实现即时的文件转发,需要先下载下来我再发送,我是给下载加速的所以也不需要做反盗链或者下载限制什么的,即时性能最重要。 |
7
chsola OP @shiny 主要是proxy比较难以实现
我需要从uploaded.to获取文件 serverfault上的是个下载认证配置吧... 读文件是本地的 我的文件是即时使用curl从远端获取 菊苣有转发一个文件的示范的话跪求 nginx的proxy模块无法设置cookie,所以不能用于下行。 做nginxmod的话工程量太大。 |
9
est 2014-01-15 14:54:41 +08:00 1
|
10
horsley 2014-01-15 15:10:17 +08:00
如果不是像curl下下来那样存储转发的话,我觉得可以用socket的方法,用一个固定大小的小的缓冲区循环read,同时直接输出,这样应该就能少占用内存,直接转发,坏处是断点续传多线程什么的都不支持了
|
12
suriv520 2014-01-15 16:27:04 +08:00
硬盘也是缓存。缓存是一定得有的。
另外,PHP的模型不适合干这个,别用PHP折腾了…… |
13
dorentus 2014-01-15 17:03:22 +08:00
@feuvan 改 nginx 配置需要 restart/reload nginx 才能生效。
另外楼主说的这个和 nginx 完全没关系吧。想要改 header 或者设 cookie 完全可以在 PHP 里面做(不过这也和楼主的问题没关系)。 |
14
chsola OP |
15
est 2014-01-15 19:58:42 +08:00
|
16
ovear 2014-01-15 20:18:56 +08:00
- -目前找不到可以读取一部分内容的php api或lib,lz可以找一下,或者用上面所说的
然后每次用完buffer以后,手动的unset试试? |
17
donwa 2014-01-15 22:33:53 +08:00
如果网盘支持断点续传。
php就可以先下载一部分,传给用户,再下载后续的块继续下载,继续传给用户。 5~6年前好像做过一个php文件来下载大文件的。。。好像是这样的。 |
18
chsola OP @est 有没有什么方法让nginx发送分割了的文件?我现在在考虑用户提交链接,我去扒取两个2m的片段,开始发送,用户接受完成了一个1m的片段后我开始准备下一个1m片段 并且清理已经发送的1m
|
19
est 2014-01-15 23:24:16 +08:00
@chsola 你的意思是rapidshare本来就是2M一个2M一个的文件,也是多个URL,用户需要点一次就下载完毕,而不需要麻烦人工去挨个点击下载?
这个其实也好做。限制一个session一个下载任务即可。客户端每5秒检查一次是否可以继续下载另外一个文件。这个也兼容老浏览器。 如果你技术足够牛逼可以在服务器接受同时多个TCP连接,保持cwnd置空无数据,但是不要断掉,然后只给其中一个tcp连接返回数据,一个文件传输完毕就关闭tcp连接开始给第二个tcp连接写数据。。依次类推。 现代浏览器的话,可以模仿mega那种,完全用html5的API实现js可控的下载。甚至可以实现多文件顺序下载。不过前后台架构也比较复杂了。 |
20
chsola OP @est 不是,rapid上可能是几g的超大单文件,我利用高级会员可以断点续传,用户下载到了,我再给准备文件,用户不下载或者距离这个点超过1m,我就不准备
|
28
donwa 2014-01-16 12:50:03 +08:00 via iPhone 1
|
29
est 2014-01-16 13:27:34 +08:00 1
@donwa 断点续传需要客户端浏览器大手术。去看看html5 file blob api 吧。
http://stackoverflow.com/a/20254988/41948 https://mega.co.nz/#blog_1 |
30
chsola OP @est 我看了看实际上要是纠结php的话用php打个socket发送就可以了,发送过程是阻断式所以我知道用户确实接受完毕了文件的片段,断点续传用socket实现也是有可能的。
http://www.cnblogs.com/funlake/archive/2012/04/06/2435241.html 已经有打好的可以用了~ |
31
lwd2136 2016-12-29 22:16:04 +08:00 1
这个最后实现没?
|