0

我有一个使用 Laravel 4 编写的 Web 应用程序,它在用户请求某个页面或单击按钮时运行脚本。这应该在后台激活脚本。

目前,我的设置如下所示,

控制器部分:

public function getWorkerPage() {           

    Queue::push('UpdateUserVar1', array('id' => $login->id));

    Queue::push('UpdateUserVar2', array('id' => $login->id));

    Queue::push('Worker', array(
        'login_id' => $login->id
    ));

    .... // Some more stuff

    View::make('workerpage');
}

工人:

class Worker {

    public function fire($job, $data) {
        ...
        //Process (Takes around 10 minutes)

        // Release the job which makes the worker work until it deletes itself by a piece of logic in the Process bit above.
        $job->release();
    }

}

现在,我的整个问题是,当多个用户请求运行此脚本时,前一个作业需要 10 分钟才能完成。我不想要那个。我希望这些脚本只在后台运行,直到用户停止它。当用户请求运行脚本时,它会立即运行。

我想我需要带走队列,但我的问题是,页面将继续加载加载,这也不是我想要的,因为在Queue::push's 之后,有一个正常的视图。所以我正在寻找一个 PHP 程序或一个函数,它可以让我执行脚本,传递几个变量,并且不会阻塞 Controller 中的其余代码。

我确实找到了一些解决方案,例如 Gearman 和 Supervisord,但我无法真正判断这些是否适合我,因为我没有完全掌握文档。

如果我的问题不完全清楚,请随时提问。

简而言之:我需要一个在后台执行我的脚本的程序,使我能够继续使用 Laravel 函数并传入变量,而不会在程序执行后阻塞代码。

4

1 回答 1

5

所以我正在寻找一个 PHP 程序或一个函数,它可以让我执行脚本,传递几个变量,并且不会阻塞 Controller 中的其余代码。

这正是队列的用途。然而,开箱即用,Laravel 中的队列将被同步调用,因此会阻塞控制器中的其余代码。

这是因为设置队列需要一些第三方软件才能运行,例如安装 beanstalkd或使用iron.io。Laravel 默认在创建队列时只运行队列,因为它不能假设您提前设置了任何队列处理功能。

我不能 100% 确定您的业务目标是什么(能够在处理过程中停止队列作业?),但我认为您在应用程序中的队列功能/方式方面缺少一些必要的信息。

于 2013-10-21T15:05:34.950 回答