我有一个功能,需要很长时间才能执行所以我想在后台运行此功能可以吗?
我想在用户点击按钮上运行此功能。并且不想从终端运行任何命令。
谢谢
为了实现队列系统,需要遵循这些步骤。
- 按钮单击路径(/ usertask / performAction)在您的控制器中假设(UserTaskController.php)1-为您的作业添加命名空间。
<?php
use App\Jobs\ProcessTask; // job class that will be created later
class UserTaskController extends Controller
{
// controllers function
function performAction()
{
...
...
...
// code to place background task
$data = [];
$job = ( new ProcessTask($userId, $data))->onQueue('ProcessTask');
if ($this->dispatch($job)) {
info('job dispatched');
} else {
info('job dispatch failed');
}
// code to place background task ends
}
现在创建一个作业文件。您的jobs文件夹中的(ProcessTask.php)。 ProcessTask.php
--------
<?php
namespace App\Jobs;
use Log;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessTask extends Job implements ShouldQueue
{
use InteractsWithQueue,
SerializesModels;
/**
* Create a new command instance.
*
* @return void
*/
protected $userId;
protected $data;
public function __construct($userId, $data)
{
$this->userId = $userId;
$this->data = $data;
}
/**
* Execute the command.
*
* @return void
*/
public function handle()
{
try {
// perform your task
/*
$this->userId
$this->data
*/
return true;
} catch (\Exception $e) {
Log::error('ProcessTask:: Exception occured ');
Log::error($e);
$this->release(); //release the job back to queue, as attempts increase fail to be
return false;
}
}
public function failed()
{
Log::info('ProcessTask :: failed ends');
}
}
?>
///现在你可以在终端()中运行你的工作
php arrtisan queue:listen --queue=ProcessTask --timeout=600
在你的终端(或者你可以把它放在主管)
与队列驱动程序相关的设置
/var/www/html/infinito/config/queue.php
make QUEUE_DRIVER as database.
'default' => env('QUEUE_DRIVER', 'database'),