2

我正在编写一个需要在后台执行 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/看起来它可以完成这项工作。

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

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

4

1 回答 1

1

大约 2.5 年前,我为 PHP 守护程序实现了一个解决方案。我的应用程序在一个封闭的环境中运行,并且只有几个用户。因此,可伸缩性、性能和安全性并不是真正需要的。

我基本上以 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];

请记住,此解决方案在内存上非常密集,因为每个启动的进程都可能占用 5MB 或更多的 RAM。(但这取决于你的 PHP 安装、你的系统和你的脚本)

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

于 2013-10-24T13:01:57.987 回答