如何在后台休眠PHP(Laravel5.2)
我创建了一个如何在后台休眠PHP(Laravel5.2),php,multithreading,laravel-5,sleep,Php,Multithreading,Laravel 5,Sleep,我创建了一个artisan命令,希望在调用方法后立即运行该命令。但是该命令包含一个sleep()命令。我想在后台运行artisan命令,因为该方法需要立即返回对用户的响应。我的示例代码如下所示: 在路由文件中 Route::get('test', function(){ Artisan::queue('close:bidding', ['applicationId' => 1]); return 'called close:bidding'; }); 在关闭:投标命令中
artisan命令
,希望在调用方法后立即运行该命令。但是该命令包含一个sleep()代码>命令。我想在后台运行artisan命令,因为该方法需要立即返回对用户的响应。我的示例代码如下所示:
在路由文件中
Route::get('test', function(){
Artisan::queue('close:bidding', ['applicationId' => 1]);
return 'called close:bidding';
});
在关闭:投标
命令中
public function handle()
{
$appId = $this->argument('applicationId');
//following code line is making the problem
sleep(1000 * 10);
//close bidding after certain close time
try{
Application::where('id', $appId)->update(['live_bidding_status' => 'closed']);
}catch (\PDOException $e){
$this->info($e->getMessage());//test purpose
}
$this->info($appId.": bid closed after 10 seconds of creation");
}
问题
当我点击/test
url时,返回字符串称为close:bidding
在浏览器加载10秒后显示,因为命令中有一个sleep(10*1000)
我想要什么
我想在后台运行该命令。我的意思是,当我点击/test
url时,它应该立即显示名为close:bidding
的命令,但是close:bidding
命令将在后台运行。10秒后,它将更新应用程序,尽管前端用户不会注意到它的任何内容
部分问题
它是否与多线程相关
这是不是使用PHP无法解决的问题,我应该换一种方式思考吗
即使使用Laravel队列,也有办法解决这个问题吗
创造一份工作
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class JobTest implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
private $payload = [];
public function __construct($payload)
{
$this->payload = $payload;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$appId = $this->payload('applicationId');
//following code line is making the problem
sleep(1000 * 10);
}
}
在这种状态下,我们有作业,您将作业分发到队列。但它还没有被处理。我们需要队列侦听器或工作者在后台处理这些作业
php artisan queue:listen --queue=queue_name --timeout=0
OR
php artisan queue:work --queue=queue_name --timeout=0 //this will run forever
注:
也许你可以试试supervisord,beanstakd来管理队列
欲了解更多信息,请参考如果您不需要适当排队的所有优点,这是有代价的,那么使用它就足够了。将响应发送到浏览器后,它将执行此任务。可能是您可以尝试Larvel队列作业,而不是CommandThank。谢谢,我将尝试它是否会影响对服务器的任何进一步请求?@Al-ImranAhmed,我不确定我是否理解此问题。你有什么特别的担心吗?假设,我点击了一个url,我得到了响应,然后在提供了响应之后,服务器正在处理另一个任务(在terminable中间件中)。在该任务中,我有一个sleep(1000*10)
命令。同时,如果向服务器发出另一个请求,前一个请求的可终止任务(睡眠)是否会影响新请求。我仍然不明白您所说的影响新请求是什么意思。在这个问题上,它不会比最初的实现对它产生更坏的影响。共享资源的常见限制适用,例如,如果您在一个线程中写入锁定文件,并在第一个请求释放锁定之前尝试在另一个请求中写入同一个文件,则是,它将影响。否则,两个请求由两个不同的进程处理,它们不会相互干扰<代码>终止
不会改变php的工作方式,它只是在执行代码之前刷新输出缓冲区。谢谢。通过单词affect
我问道,因为前面的请求是sleep
命令,并且某个东西(可能是PHP)正在睡眠一段时间。因此,在睡眠时间内,如果出现另一个请求,新请求将不得不等待,直到旧请求的睡眠时间结束。我的意思是说所有这些都是一个小小的词affect
。我的错。你能澄清一下你最后的命令吗?当我创建作业并在队列上分派作业时,也会发生同样的情况。我没有使用php artisan queue:work--queue=queue\u name--timeout=0
命令,因为我不知道它在做什么,为什么需要它。更新我的答案可能会有任何帮助。或者通过answer onceSo中的链接,我需要一个队列侦听器或工作者来处理我的工作。但是谁将运行queue:listener
或queue:worker
命令?
php artisan queue:listen --queue=queue_name --timeout=0
OR
php artisan queue:work --queue=queue_name --timeout=0 //this will run forever