Очередь Laravel не выполняет работу в фоновом режиме

Я пытаюсь использовать очередь laravel для отправки массовых писем. Пока что я записал логику, и она работает нормально, но проблема в том, что когда я писал логику в контроллере, это занимало много времени, поэтому я подумал об использовании заданий, но проблема снова не устранена.

Моя проблема

Моя проблема в том, что я не могу отправить электронное письмо в фоновом режиме, даже если я использую очередь.

Контроллер

    public function newsletter(Request $request)
    {
        //dd($request->all());
        dispatch(new SendEmail($request));

        Session::flash('message', 'Email Sent');
        Session::flash('class', 'success');
        return redirect()->route('news');
    }

Вакансии

    public function handle(Request $request)
    {
        //
        $data = array(
            'message' => $request->message,
            'subject' => $request->subject,
            'file' => $request->file("file")
        );
        
        $teachingLevel = $request->highest_teaching_level;
        $school = $request->school;
        $province = $request->province;
        $district = $request->district;

        $subject = $request->subject;

        if ($teachingLevel != "" && $school != "" && $province != "" && $district != "") {
            $email = User::where('highest_teaching_level', $teachingLevel)->where('current_school_name', $school)->where('address','LIKE', '%'.$province.'%')->where('address','LIKE', '%'.$district.'%')->pluck('email');
        }else{
        $email = User::pluck('email');
        }
        
        foreach($email as $e)
        {
            Mail::to($e)->send(new NewsLetter($data, $subject));
        }
    }

Письмо отправляется, но в фоновом режиме этого не происходит. Возможно, это связано с тем, как я передал переменную $request в функцию handle().

Любая помощь будет оценена. Спасибо!


person Riwaj Chalise    schedule 31.10.2020    source источник
comment
Пробовали ли вы использовать драйвер очереди синхронизации?   -  person Tariq Imtinan    schedule 31.10.2020
comment
@TariqImtinan Нет, я использовал очередь базы данных.   -  person Riwaj Chalise    schedule 31.10.2020
comment
тогда попробуйте с драйвером синхронизации, надеюсь, это поможет вам выяснить основную причину вашей проблемы.   -  person Tariq Imtinan    schedule 31.10.2020


Ответы (2)


Вот как я использую задания Laravel в своем проекте:

SampleJob.php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Services\SampleService;

class SampleJob implements ShouldQueue {
  use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  
  // if you omit this value, you'll be in trouble, believe me
  public $tries = 1; 

  private $param;

  public function __construct($param) {
    $this->param = $param;
  }

  public function handle(SampleService $service) {
    // do something with $this->param
    // Also, notice that you can type hint classes in handle function declaration for DI
    $service->doSomething($this->param);
  }
  
}

SampleController.php


namespace App\Http\Controllers;

use App\Jobs\SampleJob;


class SampleController extends Controller {
    
  public function sampleMethod(Request $request) {
    $param = $request->input('param');
    SampleJob::dispatch($param); // $param will be passed to SampleJob constructor
    // ...
  }

}

Несколько моментов, на которые стоит обратить внимание:

  • Прочитайте комментарии в моих фрагментах кода
  • Если вы используете очередь на основе базы данных, сначала выполните миграцию с помощью php artisan queue:table && php artisan migrate
  • Создавайте задания с помощью команды artisan: php artisan make:job Sample
  • Не забудьте запустить обработчик очереди: php artisan queue:work. Чтобы запустить его в фоновом режиме: sudo nohup php artisan queue:work > ./storage/logs/queue-worker.log &
  • Настоятельно рекомендуется: при развертывании используйте Supervisor, чтобы php artisan queue:work работало в фон
  • Если вам удастся заставить задание работать, все отложенные (поставленные в очередь, но не обработанные из-за неправильной настройки или незапущенного работника очереди) задания будут немедленно выполнены.

Распространенные ошибки:

  • Если вы не установите параметр $tries, и каким-то образом ваша работа выдает ошибку, laravel будет пытаться повторять эту работу снова и снова, пока ваша база данных не выйдет из строя :(
  • Если пользователь http и пользователь php разные, и если вы использовали Log в своей работе, в девяти из десяти раз вы столкнетесь с проблемой прав доступа в каталоге storage. Чтобы избежать этой проблемы, добавьте 'permission' => '0666' к настройке канала журнала в config/logging.php.
  • Обработчик очереди не обнаруживает изменения вашего кода, поэтому перезапустите обработчик очереди php artisan queue:restart после того, как вы внесете некоторые изменения в кодовую базу.

Моя версия ларавела: 5.8

person glinda93    schedule 31.10.2020

Если вы собираетесь работать с «базой данных», подключение необходимо для выполнения следующих миграций:

php artisan queue:table

php artisan migrate

Также есть событие и прослушиватель, реализующий интерфейс «ShouldQueue», и последним зарегистрируйте событие, связанное с прослушивателем или слушателями, в вашем пути «providers/EventProvider.php», а в файле «EventProvider.php» добавьте свое событие и слушателей. со следующей записью в качестве примера:

protected $listen = [
  Registered::class => [
    SendEmailVerificationNotification::class,
  ],
];

Важно понимать несколько моментов, связанных со следующей командой queue:restart.

php artisan queue:restart

Чтобы это работало, вам нужно запустить прослушиватель очереди:

php artisan queue:listen

Ссылка: https://medium.com/ariel-mejia-dev/run-queues-in-the-background-on-development-in-laravel-8d697d812f29

person Vildan Bina    schedule 31.10.2020