为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
繁花如伊 2021-10-08 15:39:28
我是 Laravel 的新手,并尝试创建我的第一个后台任务。使用的文档:https : //laravel.com/docs/master/queues工作:(ProcessDatabaseImport.php)<?phpnamespace 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:<?phpnamespace 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正在运行。
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

听起来你有两个问题。


立即在浏览器中运行


至于立即运行,如果 Laravel 仍在使用默认sync驱动程序,则可能会发生这种情况。检查您的/config/queue.php文件并确保env()正在使用该属性。如果您的.env文件中没有设置队列驱动程序,同步是默认的回退,但您也可以根据需要更改此设置。


'default' => env('QUEUE_CONNECTION', 'sync'),

如果一切正常,请尝试运行php artisan config:clear以清空配置缓存。默认sync驱动程序可能仍处于缓存状态。


或者,您可以尝试明确定义要使用的连接。


ProcessDatabaseImport::dispatch('database/data/contacts.json')

    ->onConnection('database')

    ->delay(now()->addMinutes(2));

运行两次


我不确定这一点,但是如果您retryUntil()从 Job 中删除该方法会发生什么?


另外,我在另一个线程中发现了类似的问题,但我不知道它是否相关。

升级到 Laravel 5.4 后排队的 Laravel 排队作业运行两次


如果这没有帮助,我们可能需要更多有关您如何启动工作的信息。您是简单地访问一个 URL,还是调用此路由的机制可能会运行两次(例如,通过 Ajax)?


您可以将适用的/config/queue.php配置添加到您的问题中,因为上面提到的线程中有一些迹象表明您retry和timeout时间可能会起作用。


查看完整回答
反对 回复 2021-10-08
  • 1 回答
  • 0 关注
  • 358 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信