Gearmanphp工作人员:根据请求进行fork处理


Gearman php-workers: fork processes on request

我有一个gearman服务器,它在后台有一个php工作脚本(由supervisord管理)。进程是异步的,因此主脚本不必等待。

问题是,我不需要100%的后台工作人员,我只需要在有工作人员的时候才需要。有什么方法可以避免后台php进程吗?例如,一些脚本将监控传入任务并执行适当的php文件?

我想到的解决方案是创建一个shell scipt,它将执行php代码,类似于:

gearman -w -f 'my_func' ./my_func_exec.sh 

其中my_func_exec.sh:

php -q my_func.php

但是我应该如何将工作负载传递给my_func.php呢?还是有现成的解决方案?

首先,我认为你不应该担心后台工作人员:它空转的开销接近于零,但它启动和停止的开销不是。

您还将遇到许多锁定问题,以避免并发客户端请求启动多个

也就是说,这里有一个适用于您的用例的模式:

  • 定义一个标志文件并在启动时触摸它(这一点很重要:文件存在意味着工人正在运行)
  • 一个客户端,它想消耗你的工作人员,unlink(),保持返回值
  • 如果这个返回值为true,那么这个线程就是解除文件链接的线程,并且在某种程度上已经获得了创建工作线程的锁定:所以他通过shell_exec()创建了一个工作线程-小心在后台启动它(即/path/to/php php -q /path/to/my_func.php &
  • 客户端等待工作者可用并提交作业
  • 工作者不使用普通的while($worker->work());循环,而是使用一个调用,然后写入标志文件并结束