可以使用PHP-FPM来管理队列使用者吗?

时间:2011-10-27 08:34:44

标签: beanstalkd php

有一个beanstalkd队列,每10分钟就会充满许多任务,并且每项任务都是尽快处理的。对于第三方服务的调用,任务可能需要花费几毫秒才能完成,第三方服务往往会不时地超时。

因此,由于PHP没有多线程,一种选择是创建大量空闲工作程序,这会尝试保留任务,但可能需要占用太多内存,而这些内存可能无法使用。

使用PHP-FPM调整工作者数量并节省一些RAM是一个好主意吗?生产准备好了吗?有更好的解决方案吗?

由于

2 个答案:

答案 0 :(得分:1)

每当我不得不同时(或异步)运行内容时,我就会将这些作业发送给gearman个工作人员。每个物理机器运行时,每个CPU核心通常至少有一个进程。

PHP-FPM是一个cgi守护进程。所以你基本上让你的beanstalkd处理器向你自己的系统运行一堆HTTP请求。那些可能必须通过你的http栈。不确定这是不是一个好主意。

您还可以查看pcntl_fork以将当前进程分成多个正在运行的进程。

答案 1 :(得分:1)

我正在运行一个每天处理数百万条消息的队列系统。主要是通过Amazon SQS,但我现在也在运行一个新的Beanstalkd系统,其中有超过600,000个msgs。

a blogpost on the subject中所述,我在循环处理消息中运行shell脚本(PHP脚本中的循环在返回之前运行多个作业也有些用处,至少对于较小的作业而言)。

这些shell脚本以Supervisord开头。还有另一个blog post on the use of that。我目前在9台机器上运行超过800个工作脚本(用于几种不同类型的作业),所有这些脚本都从各种队列中拉出并将数据放回到其他队列中,写入数据库或文件。增加每台机器的工人数量是增加“numprocs”(或已经足够大)的问题,然后根据需要启动更多。您也可以说5自动启动,然后是另一个50个可以根据需要启动的块。

我发现每个工作者只需要大约20mb的非共享内存(其余的在进程之间是通用的)。这取决于工人当然要做的任务。调整图像大小可能需要花费很多精力。部分由于这个原因,我已经设置了能够频繁重启PHP脚本。