кодесурса
«Laravel

Laravel (5,7) Очереди

script1adsense2code
script1adsense3code

Шаг 1: Настройте Laravel

Установите его с помощью следующей команды.

composer create-project laravel/laravel --prefer-dist emailqueue

Теперь в файле .env настройте базу данных и почтовый сервер.

Для отправки электронной почты я использовал https://mailtrap.io. Так что, если вы хотите использовать это, перейдите на веб-сайт и зарегистрируйтесь, и вы увидите свое имя пользователя и пароль, возьмите его и поместите в файл .env , и все готово .

Также нам нужно изменить драйвер очереди на базу данных. От

default laravel uses sync.
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:N/+b/PAQXgtG8OiYu3TKyudhicgYsGYfb551yrqkjmQ=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=queue
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=database
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=

Шаг 2: Создайте маршрут для отправки почты

Мы создадим один маршрут для отправки электронного письма, а также создадим один контроллер с именем EmailController.

php artisan make:controller EmailController

В файле route >> web.php добавьте следующий код.

Route::get('email', '[email protected]');

Хорошо, теперь нам нужно создать один почтовый класс, поэтому в терминале введите следующую команду.

php artisan make:mail SendMailable

Таким образом, он создаст этот файл внутри AppMailSendMailable.php.

Теперь напишите функцию sendMail внутри файла MailController.php .

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\SendMailable;
class EmailController extends Controller
{
    public function sendEmail()
    {
        Mail::to('[email protected]')->send(new SendMailable());
        echo 'email sent';
    }
}
Also, out SendMailable.php file looks like this.
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendMailable extends Mailable
{
    use Queueable, SerializesModels;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('welcome');
    }
}

Теперь запустите сервер с помощью следующей команды.

php artisan serve

Переключитесь в браузер и нажмите этот URL:

HTTP: // локальный: 8000 / электронная почта

Вы увидите, что есть задержка, и тогда мы можем получить почту. Итак, вот решение, и это очередь.

Шаг 3: Настройте очередь

Мы можем использовать очередь с базой данных, Redis и другими драйверами, как указано в очередях Laravel 5.7.

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

php artisan queue:table

Это создаст миграцию, а затем нам нужно перенести базу данных.

php artisan migrate

Это создаст таблицу заданий в базе данных.

Шаг 4: Создать работу

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

php artisan make:job SendEmailJob

Теперь функция отправки электронной почты будет храниться в файле задания. Так что этот файл задания выглядит следующим образом.

<?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 Illuminate\Support\Facades\Mail;
use App\Mail\SendMailable;
class SendEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Mail::to('[email protected]')->send(new SendMailable());
    }
}

В файле EmailController.php нам нужно будет запустить эту работу.

Поэтому нам нужно отправить вновь созданное задание из EmailController. Так что этот код будет выглядеть следующим образом.

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Jobs\SendEmailJob;
class EmailController extends Controller
{
    public function sendEmail()
    {
        dispatch(new SendEmailJob());
        echo 'email sent';
    }
}

Теперь снова нажмите на этот адрес электронной почты.

Тем не менее, задержка есть; мы только что переместили логику в файл задания. Нам нужно отправить почту в фоновом режиме. Так что нам нужно отложить нашу очередь .

public function sendEmail()
{
   $emailJob = (new SendEmailJob())->delay(Carbon::now()->addSeconds(3));
   dispatch($emailJob);
   echo 'email sent';
}

Теперь снова нажмите URL.

На этот раз задержка составляет всего 3 секунды, или мы можем сказать, что нет задержки, но подождите, если вы переключитесь на mailtrap, то и почты тоже нет. Так как мы можем отправлять реальную почту также.

Перейдите в базу данных и посмотрите таблицу заданий . Есть одна запись для работы. Значит, процесс этой работы еще не начался. Итак, Laravel, существует концепция под названием Queue Worker. Нам нужно запустить этого работника очереди .

Переключитесь на терминал и введите следующую команду, чтобы запустить работника очереди.

php artisan queue:work
In the terminal, it will say like this.
[2019-04-17 13:58:14] Processing: App\Jobs\SendEmailJob
[2019-04-17 13:58:19] Processed:  App\Jobs\SendEmailJob

Теперь перейдите к почтовой ленте, и да, мы увидим, что почта отправлена.

Предыдущая: Laravel (5.7) Разработка пакетов
Далее: Laravel (5.7) Планирование задач

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code