使用Laravel在后台执行PHP脚本

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

目前,我的设置如下所示,</ p>

控制器部分:</ p>

 公共函数getWorkerPage  (){

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

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

Queue :: push('Worker',array(
'login_id'=&gt; $ login-&gt; id
));
\ n .... //更多东西

View :: make('workerpage');
}
</ code> </ pre>

工人:</ p>

</ p>

  class Worker {

公共函数fire($ job,$ data){
...
//进程( 需要大约10分钟)

//释放使工作人员工作的工作,直到它通过上面的Process位中的逻辑删除自身。
$ job-&gt; release();
}

}
</ code> </ pre>

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

我想我需要拿走队列然后我的问题是,该页面将继续加载加载,这不是我想要的,因为在队列之后 :: push </ code>,有一个普通的View。 所以我正在寻找一个PHP程序或一个函数,它允许我执行脚本,传入几个变量,而不会阻塞Controller中的其余代码。 </ p>

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

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

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

展开原文

原文

I have a web application written using Laravel 4 that runs a script when a user requests a certain page or clicks a button. This should activate the script in the background.

Currently, my setup looks like this,

Controller portion:

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');
}

Worker:

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();
    }

}

Now, my whole problem is that when more than one user requests this script to be run, it takes 10 minutes before the previous job is finished. I don't want that. I would like those scripts to just run in the background until the user stops it. And when the user requests the script to be run, that it just runs immediately.

I guess I need to take away the queue then but my problem then is, is that the page will keep loading loading and that's not something that I want either since after the Queue::push's, there is a normal View. So I'm searching for a PHP program or a function that lets me execute the script, pass in a couple variables and that without blocking the rest of the code in the Controller.

I did find some solutions like Gearman and Supervisord but I couldn't really judge if these were options for me since I didn't quite grasp the documentation.

If something is not totally clear about my question, please do not hesitate to ask.

Nutshell: I need a program that executes my script in the background and enables me to keep using Laravels function and pass in variables without blocking the code after the program execute.

1个回答




所以我正在寻找一个PHP程序或一个让我执行脚本的函数,传入一对 变量并且不会阻塞Controller中的其余代码。</ p>
</ blockquote>

这正是Queues的用途。 但是,开箱即用, Laravel中的队列将是 同步调用,因此将阻止控制器中的其余代码。</ p>

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

我不能100%确定您的业务 目标是(能够在中间处理中停止队列作业吗?),但我认为你在队列在应用程序中的运行方式和方式。</ p>
</ div>

展开原文

原文

So I'm searching for a PHP program or a function that lets me execute the script, pass in a couple variables and that without blocking the rest of the code in the Controller.

That's exactly what Queues are for. However, out of the box, Queues in Laravel will be called synchronously and will therefore block the rest of the code in your controller.

This is because setting up Queues requires some third party software to function, such as installing beanstalkd or using iron.io. Laravel defaults to just running the queue when you create them because it can't assume you have any queue-processing functionality setup ahead of time.

I'm ot 100% sure what your business goals are (being able to stop a queue job mid-processing?), but I think you're missing some needed information in what/how Queues function within an application.

dongyi1111
dongyi1111 我的脚本唯一做的就是建立一个站点连接,编辑一些模型细节,并将一些信息记录到数据库中。 你有skype或类似的东西,因为你看起来像是可以帮助我的人。
接近 7 年之前 回复
douqiao7188
douqiao7188 Beanstalkd应该注意确保多个worker不会尝试运行相同的JOB。 是否可以同时使用相同的脚本取决于您的代码详细信息。 除非你的工作以某种方式覆盖彼此的工作,否则应该没问题。 这是您的代码的实现细节。
接近 7 年之前 回复
douyue8191
douyue8191 一个问题,如果我打开多个队列:listen我发现同一个脚本不能多次激活。 真的吗?
接近 7 年之前 回复
dryeyhe0266
dryeyhe0266 您可以通过多次运行queue:listen命令来实现。 在最简单的形式中,您可以直接在终端中多次输入该命令。 是的,这可以(通常应该)在不同的服务器上完成。 请注意,侦听队列中作业的服务器需要具有可用于运行作业的代码。 因此,您最终可能会在多台服务器上找到应用程序的副本。 没关系。 最后,根据您的问题,我认为您需要阅读有关队列如何工作的更多信息。
大约 7 年之前 回复
doushan2224
doushan2224 我怎样才能做到这一点? 我可以在不同的服务器上有多个工作人员等吗?
大约 7 年之前 回复
douhuan1257
douhuan1257 是的 - 您可以设置多个工作人员监听同一个队列。 在链接的文章中,它描述了使用queue:listen命令并使用Supervisor进行监视。 您可以创建多个侦听器,并让Supervisor监视所有侦听器。 注意:如果您需要动态创建监听器(每个用户一个),那么我没有好的建议。 这不一定是对队列的大量使用。
大约 7 年之前 回复
doukanwa6872
doukanwa6872 我现在为Laravel设置了一个Beanstalkd。 但问题是,它一次只能处理一项工作。 我想立刻处理所有工作。 或者一旦他们进来。这有意义吗?
大约 7 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐