我有一个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());
循环,而是使用一个调用,然后写入标志文件并结束