Laravel5.6 utilisation des tâches planifiées pour atteindre la messagerie calendrier

Cet article est d'utiliser les crontab Linux tâches planifiées pour aider à la réalisation de la tâche planification Laravel

Tout d'abord, créer un projet

1. Ouvrez un terminal, exécutez la commande suivante : laravel new crontaby compris une base de données, afin d' assurer que le fonctionnement normal local. Par la suite déployé sur la ligne. phpstromSe connecter au serveur, assurez -vous que le code peut être correctement soumis au serveur.
2, créer un type de tâche, exécuter la commande de terminal: php artisan make:command SendEmail
3, modifier le SendEmail.phpfichier

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

4, le premier e-mail ne panique pas, tout d'abord à un moment de l'écriture du fichier de test, écrire l'heure actuelle dans le fichier, comme suit

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

Note: où PHP_EOLreprésente la liste de temps wrap, celui - ci FILE_APPENDrenvoie append un enregistrement.

5, modifier le app/Console/Kernel.phpfichier:

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

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

6, sur le serveur, dans le projet: cd /var/www/crontab, vérifiez d' abord le serveur PHPchemin d'installation, exécutez la commande suivante : which phpmon PHPchemin /usr/bin/php, puis enregistrez la copie sur le chemin, puis exécutez la commande suivante : crontab -esélectionnez Ouvrir, sélectionnez les quatre premières recommandations. Dans la dernière ligne ajoutez le code suivant:

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

Note: Voici la partie avant /usr/bin/phpau nom du serveur PHPchemin d'installation, la partie arrière du représentant répertoire du projet.
De plus en face de la commande ci - dessus cinq astérisque * représentent les minutes, heures, jours, mois, semaines.
Min: entier, astérisque par défaut et l'astérisque 0-59 / 1 pendant 1 minute.
Heures: nombre entier de 0-23.
Jour: Entier 1-31.
Mois: Entier 1-12.
Semaine: entier de 0-7, 0 et 7 représentent dimanche.
crontab -l à la liste la tâche planifiée courante.

7, démarrer la tâche sudo service cron restart, ouverte FZ, vue sur le projet de serveur racine file.txts'il est temps de fichiers d'écriture et d' exécuter toutes les minutes. Après avoir confirmé la mise en œuvre réussie de la commande service cron stopet exitsorties chronométré tâches.

En second lieu, pour obtenir la poste

L'étape suivante consiste à écrire le fichier en service chronométré courrier. Dans les .envinformations sur les fichiers nécessaires pour configurer le courrier.

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, ouvert des web.phproutes, des add

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

2, Homeajoutez le contrôleur de code suivant:

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]');
// });
}

Test: routage d'impression terminal, l' adresse de routage pour obtenir le navigateur pour visiter: http://你的二级域名/admin/mailpour voir si la boîte aux lettres pour recevoir des messages. Si la réception réussie du message, continuez vers le bas. .

3, ouvrez la classe de tâches SendEmail.phpfichier, la modification de handlela méthode, comme suit:

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);
      }
    });
}

Enfin, le projet en cours sur le serveur, lancez la commande de la minuterie service cron restart, attendez une minute pour voir si le message est reçu et exécuté une fois par minute.

En troisième lieu, l'augmentation file d'attente Redis

Lorsque nous voulons envoyer une grande quantité d'e-mail, nous utiliserons la file d' attente, le message est envoyé à toute la file d' attente enregistrées, de sorte que le back-end pour terminer l'opération de longue haleine. Lot d'informations en ligne utilisent une file d' attente de base de données, j'utilise ici redisla file d' attente.

1, modifier .env fichier QUEUE_DRIVER=syncest QUEUE_DRIVER=redis
2, la file d' attente de lancement, Terminal exécutez la commande: redis-servervous trouverez predisun étendu non installé, exécutez la commande suivante : composer require predis/predisinstaller. Une fois l'installation terminée, redémarrez Redis.
3, créer une tâche catégories: php artisan make:job SendReminderEmailAprès une course réussie app/Jobsgénérera un répertoire SendReminderEmail.php, nous modifions son contenu comme suit:

<?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, créez une vue partielle mailresources/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>

Quatrièmement, pousser les tâches de la file d'attente - tâche de distribution manuelle

1, web.phpajoutez la route suivante:

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

2, créer la commande: php artisan make:controller MailControllerécriture contrôleur le code suivant:

<?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, exécuter la file d' attente d' écoute. L' accès dans le navigateur http://你的二级域名/mail/sendReminderEmail/63, puis poussé à la tâche Redisfile d' attente. Exécutez la commande suivante à la ligne de commande: php artisan queue:workpuis aller voir la boîte aux lettres recevra un rappel par e-mail:

4, la tâche de poussée à une file d' attente spécifiée, la modification à l' App\Console\Commands\SendEmailintérieur du handlecode de procédé comme suit:

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);
      }
  });
}

Le test ultime: voir si le courrier est reçu un e-mail chaque minute
début: redis-server
Début: php artisan queue:work
Début mise en œuvre régulière:service cron restart

références:http://laravelacademy.org/post/2012.html
http://laravelacademy.org/post/222.html#ipt_kb_toc_222_14

Bien joué !!!

Publié 14 articles originaux · louange gagné 1 · vues 89

Je suppose que tu aimes

Origine blog.csdn.net/huangdj321/article/details/104929571
conseillé
Classement