Php nginx如何处理长时间运行的请求,如文件下载?

Php nginx如何处理长时间运行的请求,如文件下载?,php,nginx,Php,Nginx,从我对nginx的有限理解中,我知道nginx通过使用一个线程来处理所有请求,而不是使用Apache来抛出线程来解决问题,从而将自己与Apache分离。从理论上讲,一堆小请求会更快。但是长时间运行的请求呢 假设一个用户正在下载一个大文件,或者某个长时间运行的PHP脚本速度很慢,因为它所依赖的某些东西(磁盘IO、数据库)速度很慢。在Apache中,所有东西都有自己的线程,因此当PHP等待数据库的响应时,另一个请求可以进入并同时被处理。然而,对于nginx,这样的事情不会锁定线程,从而锁定整个服务器

从我对nginx的有限理解中,我知道nginx通过使用一个线程来处理所有请求,而不是使用Apache来抛出线程来解决问题,从而将自己与Apache分离。从理论上讲,一堆小请求会更快。但是长时间运行的请求呢

假设一个用户正在下载一个大文件,或者某个长时间运行的PHP脚本速度很慢,因为它所依赖的某些东西(磁盘IO、数据库)速度很慢。在Apache中,所有东西都有自己的线程,因此当PHP等待数据库的响应时,另一个请求可以进入并同时被处理。然而,对于nginx,这样的事情不会锁定线程,从而锁定整个服务器吗?我知道您可以有多个nginx进程,但创建更多的进程只是为了文件下载,这就像试图重新创建Apache一样

我知道我在这里遗漏了一些东西,因为nginx处理类似的情况,但是什么呢?nginx如何使用其线程模型实现这一点


在您说之前,这不是的重复,因为它只讨论传入连接

nginx中的工作进程可以同时处理多个传入和传出请求。您链接的问题()的答案也适用于此问题。

可能重复的-HTTPD仅用于输入连接。@hakre请阅读最后一句话。这个问题只涉及传入数据(传入缓冲区已满、已读且正在处理)。当nginx所依赖的东西运行缓慢时,我明确地说的是输出。出于某种原因,它被称为
IO
。底层操作系统实际上是将数据发送到客户端,而不是nginx,尤其是在大型文件的情况下。阅读另一个答案,它很好地解释了为什么NGINX中的单个线程不会被单个IO操作阻塞。输入或输出在这里没有区别。@hakre是否工作进程也会绕过nginx并直接将数据发送到客户端?nginx是如何告诉操作系统向客户端发送文件的,这看起来不像是操作系统在其中烘焙的操作,因为没有绕过nginx,只是nginx在操作系统之上工作。如果您将数据发送到网络接口,则不需要等待数据通过。请先阅读另一个答案并理解它。这也有助于你澄清你的问题。但是大文件下载呢?是委派给工作进程的。请看上面我对@hakre所说的关于这个问题的评论,这个问题只涉及传入数据(缓冲区已满、已读且正在处理)。我想知道当nginx依赖的东西速度慢的时候,传出的数据会怎么样。是的,大型下载也是异步处理的。