使用Laravel在后台执行PHP脚本

时间:2013-10-21 13:16:54

标签: php background laravel worker

我有一个使用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之后,有一个正常的视图。所以我正在寻找一个PHP程序或一个函数,它允许我执行脚本,传入几个变量,而不会阻塞Controller中的其余代码。

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

如果我的问题不完全清楚,请不要犹豫。

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

1 个答案:

答案 0 :(得分:5)

  

所以我正在搜索一个PHP程序或一个允许我执行脚本的函数,传入几个变量,而不会阻塞Controller中的其余代码。

这正是Queues的用途。但是,开箱即用Queues in Laravel will be called synchronously,因此会阻止控制器中的其余代码。

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

我100%确定您的业务目标是什么(能够在处理中间停止队列工作?),但我认为您在what/how Queues function within an application中缺少一些必要的信息。