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 crontab
y compris une base de données, afin d' assurer que le fonctionnement normal local. Par la suite déployé sur la ligne. phpstrom
Se 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.php
fichier
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_EOL
représente la liste de temps wrap, celui - ci FILE_APPEND
renvoie append un enregistrement.
5, modifier le app/Console/Kernel.php
fichier:
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 PHP
chemin d'installation, exécutez la commande suivante : which php
mon PHP
chemin /usr/bin/php
, puis enregistrez la copie sur le chemin, puis exécutez la commande suivante : crontab -e
sé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/php
au nom du serveur PHP
chemin 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.txt
s'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 stop
et exit
sorties 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 .env
informations 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.php
routes, des add
$this->any('mail', 'HomeController@mail');//发邮件
2, Home
ajoutez 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/mail
pour 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.php
fichier, la modification de handle
la 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 redis
la file d' attente.
1, modifier .env fichier QUEUE_DRIVER=sync
est QUEUE_DRIVER=redis
2, la file d' attente de lancement, Terminal exécutez la commande: redis-server
vous trouverez predis
un étendu non installé, exécutez la commande suivante : composer require predis/predis
installer. Une fois l'installation terminée, redémarrez Redis.
3, créer une tâche catégories: php artisan make:job SendReminderEmail
Après une course réussie app/Jobs
gé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.php
ajoutez 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 Redis
file d' attente. Exécutez la commande suivante à la ligne de commande: php artisan queue:work
puis 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\SendEmail
intérieur du handle
code 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é !!!