在后台执行多个PHP脚本

时间:2013-10-16 21:32:44

标签: php background laravel gearman worker

我正在编写一个需要在后台执行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?一个完整的新实例?如果是这样,如何使用哪个程序/平台?

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

1 个答案:

答案 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函数,这可能不是您想要做的事情。