Laravel Job 立即在浏览器中执行,而不是在后台队列中运行

我是 Laravel 的新手,并尝试创建我的第一个后台任务。


使用的文档:https : //laravel.com/docs/master/queues


工作:(ProcessDatabaseImport.php)


<?php


namespace App\Jobs;


use App\Contact;

use Illuminate\Bus\Queueable;

use Illuminate\Queue\SerializesModels;

use Illuminate\Queue\InteractsWithQueue;

use Illuminate\Contracts\Queue\ShouldQueue;

use Illuminate\Foundation\Bus\Dispatchable;

use Illuminate\Support\Facades\Log;

use Illuminate\Support\Facades\File;


class ProcessDatabaseImport implements ShouldQueue

{

    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;


    protected $file;


    /**

     * Create a new job instance.

     *

     * @param String $filePath

     * @return void

     */

    public function __construct($filePath)

    {

        // init File object "database/data/contacts.json"

        $this->file = base_path($filePath);

    }


    /**

     * Execute the job.

     *

     * @return void

     */

    public function handle()

    {

       Log::info('Hello world! file: '.$this->file);

    }


    /**

     * Determine the time at which the job should timeout.

     *

     * @return \DateTime

     */

    public function retryUntil()

    {

        return now()->addSeconds(30);

    }

}

?>

作业控制器.php:


<?php


namespace App\Http\Controllers;


use App\Jobs\ProcessDatabaseImport;

use Carbon\Carbon;

use Illuminate\Contracts\Queue\Job;

use Illuminate\Support\Facades\Queue;


class JobController extends Controller

{

    /**

     * Handle Queue Process

     */

    public function processQueue()

    {

        ProcessDatabaseImport::dispatch('database/data/contacts.json')->delay(now()->addMinutes(2));


        return view('home');

    }

}

作业表已创建,php artisan queue:work正在运行。


繁花如伊
浏览 359回答 1
1回答

幕布斯7119047

听起来你有两个问题。立即在浏览器中运行至于立即运行,如果 Laravel 仍在使用默认sync驱动程序,则可能会发生这种情况。检查您的/config/queue.php文件并确保env()正在使用该属性。如果您的.env文件中没有设置队列驱动程序,同步是默认的回退,但您也可以根据需要更改此设置。'default' => env('QUEUE_CONNECTION', 'sync'),如果一切正常,请尝试运行php artisan config:clear以清空配置缓存。默认sync驱动程序可能仍处于缓存状态。或者,您可以尝试明确定义要使用的连接。ProcessDatabaseImport::dispatch('database/data/contacts.json')&nbsp; &nbsp; ->onConnection('database')&nbsp; &nbsp; ->delay(now()->addMinutes(2));运行两次我不确定这一点,但是如果您retryUntil()从 Job 中删除该方法会发生什么?另外,我在另一个线程中发现了类似的问题,但我不知道它是否相关。升级到 Laravel 5.4 后排队的 Laravel 排队作业运行两次如果这没有帮助,我们可能需要更多有关您如何启动工作的信息。您是简单地访问一个 URL,还是调用此路由的机制可能会运行两次(例如,通过 Ajax)?您可以将适用的/config/queue.php配置添加到您的问题中,因为上面提到的线程中有一些迹象表明您retry和timeout时间可能会起作用。
打开App,查看更多内容
随时随地看视频慕课网APP