uso Laravel5.6 tareas para lograr la sincronización de correo programado

Este artículo es el uso de las tareas programadas crontab de Linux para ayudar a lograr la programación de tareas laravel

En primer lugar, crear un proyecto

1. Abrir un terminal, ejecute el comando: laravel new crontabincluyendo una base de datos, para asegurar que el funcionamiento normal local. Posteriormente desplegado en la línea. phpstromConectar con el servidor, asegúrese de que el código puede ser presentada correctamente al servidor.
2, crear un tipo de tarea, la terminal de ejecutar el comando: php artisan make:command SendEmail
3, modificar el SendEmail.phparchivo

protected $signature = 'email:send';
protected $description = '定时发邮件测试';

4, el primer e-mail no se preocupe, primero en un momento de escribir el archivo de prueba, escriba la hora actual en el archivo, de la siguiente manera

public function handle()
{
  //写入文件
  file_put_contents("/var/www/crontab/file.txt", date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
}

Nota: donde PHP_EOLrepresenta la lista envoltura de tiempo, éste FILE_APPENDremite anexar un registro.

5, modificar el app/Console/Kernel.phparchivo:

protected $commands = [
    Commands\SendEmail::class //注册任务类
];

protected function schedule(Schedule $schedule)
{
	//每分钟执行一次文件的写入
    $schedule->command('email:send')
        ->everyMinute();
}

6, en el servidor, en el proyecto: cd /var/www/crontabprimero comprobar el servidor de PHPruta de instalación, ejecute el comando: which phpmi PHPcamino /usr/bin/php, y luego guardar la copia por el camino, y luego ejecutar el comando: crontab -eseleccione Abrir, seleccione las cuatro primeras recomendaciones. En la última línea añadir el siguiente código:

* * * * * /usr/bin/php /var/www/crontab/artisan schedule:run >> /dev/null 2>&1

Nota: Aquí la parte frontal /usr/bin/phpen nombre del servidor de PHPruta de instalación, la parte trasera del directorio representante del proyecto.
También en frente del comando anterior de cinco asterisco * representan los minutos, horas, días, meses, semanas.
Min: número entero, asterisco defecto y el asterisco 0-59 / 1 durante 1 minuto.
Horas: número entero de 0-23.
Día: Entero 1-31.
Mes: Entero 1-12.
Semana: número entero de 0-7, 0 y 7 representan domingo.
crontab -l para enumerar la tarea programada actual.

7, iniciar la tarea sudo service cron restart, abierta FZ, en la visión en el proyecto de servidor raíz file.txtsi hay tiempo para escribir y ejecutar archivos cada minuto. Después de confirmar la implementación exitosa de los comandos service cron stopy exittareas salidas cronometrado.

En segundo lugar, para lograr el correo regular

El siguiente paso es escribir el archivo en operación ha electrónico. En la .envinformación sobre los archivos necesarios para configurar el correo.

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
MAIL_USERNAME=244500972@qq.com
MAIL_PASSWORD=***** //填自己的邮箱密码
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=244500972@qq.com
MAIL_FROM_NAME=huangdj

1, abierto web.php, rutas add

$this->any('mail', 'HomeController@mail');//发邮件

2, Homeañadir el siguiente controlador de código:

public function mail()
{
   //第一种方法
   \Mail::raw('定时发送邮件 测试', function ($message) {
       $message->from('[email protected]', '长乐未央');
       $message->subject('邮件主题 测试');
       $message->to('[email protected]');
   });

  //第二种方法
// \Mail::send('admin.mail', ['name' => 'holy'], function ($message) {
//     $message->to('[email protected]');
// });
}

Prueba: Terminal de enrutamiento de impresión, la dirección de enrutamiento para obtener el navegador para visitar: http://你的二级域名/admin/mailpara ver si el buzón para recibir mensajes. Si la recepción satisfactoria del mensaje, continúe hacia abajo. .

3, abra la clase de tareas SendEmail.phpde archivo, la modificación handledel método, de la siguiente manera:

public function handle()
{
//写入文件
// file_put_contents("/var/www/crontab/file.txt", date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);

 \Mail::raw('定时发送邮件 测试', function ($message) {
    //查出要发邮件的所有用户的邮箱
    $customers = Customer::where('email', '<>', null)->get();
    foreach ($customers as $customer) {
         $message->from('[email protected]', 'huangdj');
         $message->subject('邮件主题 测试');

          //执行发送
         $message->bcc($customer->email);
      }
    });
}

Por último, el proyecto actual en el servidor, se inicia el comando temporizador service cron restart, espera un minuto para ver si el mensaje de correo se recibe y ejecuta una vez cada minuto.

En tercer lugar, la cola Redis aumento

Cuando queremos enviar una gran cantidad de correo electrónico, utilizaremos la cola, el mensaje se envía a toda la cola almacenada, de manera que el back-end para completar la operación larga. Gran cantidad de información en línea están usando una cola de base de datos, aquí utilizo redisla cola.

1, modifique .env archivo QUEUE_DRIVER=synces QUEUE_DRIVER=redis
2, cola de lanzamiento, Terminal de ejecutar el comando: redis-serverencontrará predisun prolongado no instalado, ejecute el comando: composer require predis/predisinstalar. Después de la instalación se haya completado, reinicie Redis.
3, crear unas categorías de tareas: php artisan make:job SendReminderEmailDespués de una carrera exitosa se app/Jobsgenerará un directorio SendReminderEmail.php, modificamos su contenido de la siguiente manera:

<?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\Customer;
use Illuminate\Contracts\Mail\Mailer;
class SendReminderEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $customer;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Customer $customer)
    {
        $this->customer = $customer;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle(Mailer $mailer)
    {
        $customer = $this->customer;

        $mailer->send('emails.reminder',['customer'=>$customer],function($message) use ($customer){
            $message->to($customer->email)->subject('新功能发布');
        });
    }
}

4, crear una vista parcial correoresources/views/emails/reminder.blade.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>
        亲爱的{{$customer->nickname}},您好,长乐教育新发布了Laravel5.6使用redis实现群发邮件功能,立即去体验下吧:
        <a href="https://www.whphp.com/">前往长乐教育</a>
    </div>
</body>
</html>

En cuarto lugar, empuje tareas de cola - tarea de distribución manual de

1, web.phpañadir el siguiente recorrido:

Route::get('mail/sendReminderEmail/{id}','MailController@sendReminderEmail');

2, cree el controlador: php artisan make:controller MailControllerescritura del controlador el código siguiente:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Customer;
use Mail;
use Storage;
use App\Jobs\SendReminderEmail;
class MailController extends Controller
{
    //发送提醒邮件
    public function sendReminderEmail(Request $request, $id)
    {
        $customer = Customer::findOrFail($id);

        $this->dispatch(new SendReminderEmail($customer));
    }
}

3, ejecute la cola oyente. El acceso en el navegador http://你的二级域名/mail/sendReminderEmail/63, y luego empujó a la tarea Rediscola. Ejecute el siguiente comando en la línea de comandos: php artisan queue:worky luego ir a ver el buzón de correo recibirá un recordatorio por correo electrónico:

4, la tarea de inserción a una cola especificada, modificación App\Console\Commands\SendEmaildentro de handlecódigo del método como sigue:

public function handle()
{
  \Mail::queue('定时发送邮件 测试', function ($message) {
      //查出要发邮件的所有用户的邮箱
      $customers = Customer::where('email', '<>', null)->get();
      foreach ($customers as $customer) {
           $message->from('[email protected]', 'huangdj');
           $message->subject('邮件主题 测试');

         //执行发送
		//$message->bcc($customer->email);

		//将任务推送到指定队列并延迟一分钟执行
        dispatch(new \App\Jobs\SendReminderEmail($customer->email))->onQueue('emails')->delay(60);
      }
  });
}

La prueba definitiva: para ver si el correo se recibe un correo electrónico cada minuto
de inicio: redis-server
Inicio: php artisan queue:work
Inicio aplicación periódica:service cron restart

referencias:http://laravelacademy.org/post/2012.html
http://laravelacademy.org/post/222.html#ipt_kb_toc_222_14

Bien hecho !!!

Publicado 14 artículos originales · ganado elogios 1 · vistas 89

Supongo que te gusta

Origin blog.csdn.net/huangdj321/article/details/104929571
Recomendado
Clasificación