我正在编写一个需要在后台执行PHP脚本的Web应用程序。队列的问题是它一次只能处理一个。我的问题是,如何让Beanstalk同时处理更多作业,或者如何在后台执行我的脚本,直到用户手动停止它为止。我正在使用Laravel 4,所以我可以使用所有这些方法。
提前致谢。
API无法帮助我顺便说一句。
<?php
class Workers {
public function fire($job, $data) {
$login = Login::find($data['id']);
if ($login->active == 0) {
$job->delete();
}
$job->release();
}
}
这是我目前的脚本。请注意release()
而不是delete()
。这样就可以继续执行。
我再次做了一些研究,发现背景工作者可能适合我。任何人都可以链接我一个关于如何在Linux上设置这些内容的教程以及我对后台工作者软件的选择。 Beanstalk似乎没有提供该选项。
我刚刚发现http://gearman.org/可能是可能的,但我不确定,因为我对工人知之甚少。我还发现这个http://kvz.io/blog/2009/01/09/create-daemons-in-php/看起来可以完成这项工作。
每次需要运行脚本时是否可以拥有一个唯一的worker?一个完整的新实例?如果是这样,如何使用哪个程序/平台?
我想亲自感谢帮我摆脱噩梦的家伙。当应用程序终于完成时,我有无数人向我大喊大叫。赞赏,很多!
答案 0 :(得分:1)
我在大约2。5年前实现了PHP deamons的解决方案。我的应用程序在封闭环境中运行,只有少数用户。因此,实际上并不需要可扩展性,性能和安全性。
我基本上以CLI模式启动我的守护程序作为单个PHP应用程序。
function startDeamon($daemonPath, $args = ""){
$phppath = "/../../php/php"; // points to php executable
$executionstring = $phppath." -f ".$daemonPath." ".$args;
execInBackground($executionstring);
}
function execInBackground($cmd){
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B". $cmd, "r")); // Windows
} else {
exec($cmd . " > /dev/null &"); // Operating systems like unix
}
}
通过使用守护程序脚本的路径和要为其提供的参数调用startDaemon
,将在Web服务器上启动单独的进程。一旦守护程序脚本终止,该过程就会结束。
通过访问$argv
数组,可以在守护程序中读取参数:
$myJobIs = $argv[1];
请记住,此解决方案对内存非常密集,因为每个启动的进程可能占用5 MB或更多内存。 (但这取决于您的PHP安装,系统和脚本)
您还需要允许PHP打开新进程/运行exec函数,这可能不是您想要做的事情。