我创建了一个artisan命令,希望在调用方法后立即运行.但是命令包含一个sleep();命令.我想在后台运行该artisan命令,因为该方法需要立即向用户返回响应.我的示例代码如下:
在路由文件中
Route::get('test', function(){
Artisan::queue('close:bidding', ['applicationId' => 1]);
return 'called close:bidding';
});
in close:出价命令
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时,加载浏览器10秒钟后将显示名为close:bidding的返回字符串,因为该命令内部有一个sleep(10 * 1000).
我想要的是
我想在后台运行命令.我的意思是,当我点击/ test网址时,它应该立即显示调用的close:bidding,但是close:bidding命令将在后台运行. 10秒钟后,它会更新应用程序,尽管前端用户不会注意到任何有关它的信息.
部分问题
>它与多线程相关吗?
>使用PHP无法解决吗,我应该换个角度吗?
>即使使用Laravel队列,有什么方法可以解决此问题?
解决方法:
创造工作
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);
}
}
推送作业后台队列
Route::get('test', function(){
dispatch((new JobTest)->onQueue('queue_name'));
return 'called close:bidding';
});
在这种状态下,我们有工作,您将工作转移到队列中.但尚未处理.我们需要队列侦听器或工作者在后台处理这些作业
php artisan queue:listen --queue=queue_name --timeout=0
OR
php artisan queue:work --queue=queue_name --timeout=0 //this will run forever
注意:
也许您可以尝试使用supervised,beanstakd管理队列
欲了解更多信息,请参考this
标签:laravel-5,multithreading,sleep,php
来源: https://codeday.me/bug/20191026/1936429.html