假设我对php-fpm具有以下配置:
pm = dynamic
pm.start_servers = 10
pm.max_children = 400
pm.min_spare_servers = 8
pm.max_spare_servers = 16
pm.process_idle_timeout = 10s
我们还要说,每个用户必须具有无限长的轮询请求。如果我的请求限制为10000个,并且我的网站连接了10000个用户,这是否意味着我的服务器将永远挂起?
另一个问题:servers
和children
与simultaneous requests
有何关系?每个请求都会产生一个新进程吗? servers
和children
有什么区别?据我了解,children
是过程。
PS:请不要建议Websockets或任何其他技术。
谢谢。
答案 0 :(得分:1)
在动态过程中使用PHP-FPM(这是默认值和建议值)时,您可以使用以下选项:
; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; dynamic - the number of child processes are set dynamically based on the
; following directives:
; pm.max_children - the maximum number of children that can
; be alive at the same time.
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is less than this
; number then some children will be created.
; pm.max_spare_servers - the maximum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is greater than this
; number then some children will be killed.
; Note: This value is mandatory.
回答您的问题,服务器和子进程是进程,每个进程将响应一个用户。您的服务器最多支持400个并发连接。
我已经用longpolling实现了许多系统,与按一定时间间隔刷新相比,longpolling效率更高并且使用的资源更少。
最大的问题是您的PHP进程将占用您所有的服务器内存,因此我强烈建议您寻找任何替代方法。
我使用的一个不错的选择是NGiNX HTTP Server Push module,您可以创建将信息推送到客户的脚本。使用这种方法,您可以扩展到数千个并发客户端,这是不可能直接使用PHP做到的。
例如,我制作了一个电子邮件客户端,该客户端具有用PHP编写的守护程序,该守护程序使用此NGiNX模块监视用户邮箱并推送新电子邮件的通知,并且文件系统监视使用PHP inotify完成,换句话说,我使用了几乎0的系统资源,并创建了一个具有实时通知功能且网络和处理器使用率非常低的Webmail系统,仅使用PHP和longpolling或使用refresh会导致计算量大。
我知道您不希望Websockets建议,但是根据您的需求,它几乎无法避免。