2013-10-16 108 views
2

我正在编写一个需要在后台执行PHP脚本的Web应用程序。队列问题是它一次只能处理一个队列。我的问题是,我如何让Beanstalk同时处理更多作业,或者如何在后台执行我的脚本,直到用户手动停止它为止。我使用的是Laravel 4,所以我拥有所有这些方法。在后台执行多个PHP脚本

在此先感谢。

该API无法帮助我btw。

<?php 

class Workers { 

    public function fire($job, $data) { 
     $login = Login::find($data['id']); 
     if ($login->active == 0) { 
      $job->delete(); 
     } 

     $job->release(); 
    } 
} 

这就是我的脚本当前的样子。请注意0​​而不是delete()。这是它继续执行。

我又做了一些研究,发现背景工作者可能是我的东西。任何人都可以将我链接到关于如何在Linux上设置这些内容的教程以及我的选项是关于后台工作者软件的教程。豆茎似乎不提供这种选择。

我刚刚发现http://gearman.org/可能是一种可能性,但我不确定,因为我不太了解工人。我也发现这个http://kvz.io/blog/2009/01/09/create-daemons-in-php/看起来可以完成这项工作。

每次脚本需要运行时,是否可以有一个独特的工作人员?一个完整的新实例?如果是的话,如何使用哪个程序/平台?

我想亲自感谢帮助我摆脱恶梦的家伙。当应用程序终于完成时,我有大量的人对我大喊大叫。赞赏,很多!

+2

你需要我更具体的,告诉我们你想做什么,展示一些代码,所以我们可以帮助你。 –

+0

它可以在任何地方使用,请参阅[PSR-0自动加载](http://www.sitepoint.com/autoloading-and-the-psr-0-standard/)。可能你想[创建你自己的应用程序库](http://fideloper.com/laravel-4-application-setup-app-library-autoloading)来容纳你的应用程序逻辑。 – fideloper

+0

我编辑了这个问题,使其更加清晰准确。'搁置得太宽了' – Martijn

回答

1

我在大约2.5年前为PHP deamons实施了一个解决方案。我的应用程序运行在一个封闭的环境中,只有少数用户。所以可扩展性,性能和安全性并非真正需要。

我基本上是以CLI模式将我的deamons作为单个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服务器上。该进程在守护进程脚本终止后立即结束。

参数可以在你的后台通过访问阵列,像这样来读:

$myJobIs = $argv[1]; 

请记住,这个解决方案是在内存非常密集,因为每次启动过程可能需要像RAM 5MB或更多。 (但这取决于你的PHP安装,你的系统和你的脚本)

而且你还需要允许PHP打开新进程/运行可能不是你想要做的事情的exec函数。