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 crontab
incluyendo una base de datos, para asegurar que el funcionamiento normal local. Posteriormente desplegado en la línea. phpstrom
Conectar 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.php
archivo
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_EOL
representa la lista envoltura de tiempo, éste FILE_APPEND
remite anexar un registro.
5, modificar el app/Console/Kernel.php
archivo:
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/crontab
primero comprobar el servidor de PHP
ruta de instalación, ejecute el comando: which php
mi PHP
camino /usr/bin/php
, y luego guardar la copia por el camino, y luego ejecutar el comando: crontab -e
seleccione 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/php
en nombre del servidor de PHP
ruta 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.txt
si hay tiempo para escribir y ejecutar archivos cada minuto. Después de confirmar la implementación exitosa de los comandos service cron stop
y exit
tareas 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 .env
informació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, Home
añ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/mail
para 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.php
de archivo, la modificación handle
del 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 redis
la cola.
1, modifique .env archivo QUEUE_DRIVER=sync
es QUEUE_DRIVER=redis
2, cola de lanzamiento, Terminal de ejecutar el comando: redis-server
encontrará predis
un prolongado no instalado, ejecute el comando: composer require predis/predis
instalar. Después de la instalación se haya completado, reinicie Redis.
3, crear unas categorías de tareas: php artisan make:job SendReminderEmail
Después de una carrera exitosa se app/Jobs
generará 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.php
añadir el siguiente recorrido:
Route::get('mail/sendReminderEmail/{id}','MailController@sendReminderEmail');
2, cree el controlador: php artisan make:controller MailController
escritura 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 Redis
cola. Ejecute el siguiente comando en la línea de comandos: php artisan queue:work
y 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\SendEmail
dentro de handle
có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 !!!