Laravel (5,7) Очереди
Шаг 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 программирования