nginx 能不能不要这么先进?

2015-12-21 20:34:48 +08:00
 xuexixuexi2
我刚从 Apache 换到 nginx , nginx 是异步运行 php 的?
我用 @fpassthru($file);向用户传送文件,传送完成后我记录了这次传送成功了。
这样做在 Apache 下是没问题的,但是 nginx 好像是异步执行 php 的?文件还没有传输结束,就调用了 fpassthru 后面的语句,这样无法知道这次传输是否成功啊。
要怎么修改才能让 nginx 像 Apache 一样?
5489 次点击
所在节点    NGINX
12 条回复
Zzzzzzzzz
2015-12-21 20:52:42 +08:00
fpassthru 下面那句会执行就没 nginx 的事儿了, nginx 只是负责数据对传, 最多也就对传输数据加工一下, 运行 php 是后面 fpm 之类干的活儿, 不关 nginx 事儿, 你再 debug 下吧, 不过这种文件输出在 nginx 下用 X-Accel-Redirect 头比较好.
qhxin
2015-12-21 21:01:16 +08:00
用 readfile 吧,然后刷缓冲区比较好。
xuexixuexi2
2015-12-21 21:41:56 +08:00
@Zzzzzzzzz 是不是这样写:
@header('Content-Disposition: attachment; filename=' . $filename);
@header('Content-type: application/octet-stream');
@header('X-Accel-Redirect: ' . $filepath);
然后 fread/fpassthru/fclose 都不需要了?
浏览器出现 This webpage is not available ?能指导一下吗?
xuexixuexi2
2015-12-21 22:04:44 +08:00
nginx 收到命令后是扔给 php-fpm 执行对吧?不管 php 脚本执行完后的结果?
不科学啊……

我的脚本分三部分:

1.写 sqlite 数据库:收到文件请求
2.用 fpassthru 传输文件
3.写 sqlite 数据库:发送文件完毕

Apache 运行是按 1->2->3 的顺序运行的
而 nginx 是按 1->3->2 ,有时甚至是 3->1->2 的顺序运行
是不是 nginx.conf ,或者 fastcgi 的配置问题?
ryd994
2015-12-21 23:36:20 +08:00
你先用 apache+fcgi 试试。也有可能是 mod_php 和 php-fpm 的处理不同导致的。
1->3->2 是可能的,因为 nginx 有输出缓冲,文件不大的时候就是 132 。可以 X-Accel-Buffering no 但是性能估计会很惨。
3->1->2 我认为不可能,因为 fpassthru 传输完之前不会返回,这是 php 决定的。
X-Accel-Redirect 是给 uri 不是给文件名
ryd994
2015-12-21 23:37:25 +08:00
msg7086
2015-12-22 04:02:43 +08:00
应该是因为 nginx 是异步的吧。
你以为 Apache 用 100 个线程才能顶下来的压力, nginx 是怎么用 2 个线程就顶下来的……

nginx 会尽可能快地把后端的处理跑完(也就是 1->2->3 越快越好),然后关掉 php 的链接,再用 epoll 慢慢给客户发出去。如果你一定要同步处理的话,可以试试把输出缓冲设得特别小,强制 nginx 卡在那慢慢传送。

(没试过,纯粹拍脑袋。通常为了提高系统响应效率,都是想着后端死得越早越好,这样可以腾出 PHP 进程给其他请求。)
icedream728
2015-12-22 10:24:38 +08:00
filepath 是完整路径吗?
不用 nginx 的 sendfile 改成 readfile 呢
lijinma
2015-12-22 10:35:48 +08:00
是超时了吗?返回的是什么?
Ricoo
2015-12-22 11:24:02 +08:00
看到标题进来的,结果发现竟是吐槽
Zzzzzzzzz
2015-12-22 21:47:55 +08:00
@xuexixuexi2 我建议你先把 @去掉, 让错误爆得明显一点, 现在这样不好判断.
xuexixuexi2
2015-12-29 03:35:35 +08:00
Apache 也有问题了,好奇怪,我其它下载站可以的
新开个帖来讨论好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/245176

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX