簡體   English   中英

Laravel 5.8 - 從控制台命令執行后台作業

[英]Laravel 5.8 - execute background job from console command

我的項目基於 Laravel 5.8。
我有一個控制台命令可以執行一些繁重的任務(生成非常大的 PDF 文件、發送大量電子郵件等)

我嘗試使用jobs將這些任務移動到后台進程。
這是我為了測試它是如何工作而做的:

php artisan make:job TestJob

作業文件:

class TestJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $data;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(array $data)
    {
        $this->data = $data;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        sleep(5);
        $date = new \DateTime();
        $currentDateTime = $date->format('Ymd-His');
        $logFileName = "logs/testjob-$currentDateTime.log";
        $content = var_export($this->data, true);
        $res = Storage::disk('local')->put($logFileName, $content);
        echo "[TestJob] Print to log file: $logFileName\n";
    }
}

控制台命令文件:

public function handle()
{
    echo "[Console Command] Starting...\n";

    $someData = [
        'First name' => 'John',
        'Surname' => 'Doe'
    ];
    TestJob::dispatch($someData);
    echo "[Console Command] Finished!\n";
}

執行時,這是輸出:

[Console Command] Starting...
                                                                <<< delay 5 sec.   
[TestJob] Print to log file: logs/testjob-20210628-114321.log
[Console Command] Finished!

問題:
作業在腳本內執行,而不是在后台執行

我該怎么做才能讓它在后台運行?

您應該將隊列連接(驅動程序)從同步更改為 redis(或其他支持的隊列驅動程序)。 您可以在 .env 文件中執行此操作(例如:QUEUE_CONNECTION=database)。

https://laravel.com/docs/5.8/queues#driver-prerequisites

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM