一、打开终端,执行命令:laravel new crontab
,包括数据库,确保本地能正常运行。随后部署上线。phpstrom
链接服务器,确保代码能够正常提交到服务器。
二、建立任务类,终端执行命令:php artisan make:command SendEmail
三、修改 SendEmail.php
文件php
protected $signature = 'email:send';
protected $description = '定时发邮件测试';
复制代码
四、先不慌作发邮件,先来个文件定时写入测试,在文件中写入当前时间,代码以下html
public function handle()
{
//写入文件
file_put_contents("/var/www/crontab/file.txt", date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
}
复制代码
注:这里的PHP_EOL
表明时间列表换行,后面的FILE_APPEND
是指日后追加一条记录。laravel
五、修改app/Console/Kernel.php
文件:web
protected $commands = [
Commands\SendEmail::class //注册任务类
];
protected function schedule(Schedule $schedule)
{
//每分钟执行一次文件的写入
$schedule->command('email:send')
->everyMinute();
}
复制代码
六、服务器上,进入项目:cd /var/www/crontab
,先查看服务器上PHP
安装路径,执行命令:which php
,个人PHP
路径是/usr/bin/php
,而后把路径复制保存下来,接着执行命令:crontab -e
,选择打开方式,建议选择第4个。在最后一行增长以下代码:redis
* * * * * /usr/bin/php /var/www/crontab/artisan schedule:run >> /dev/null 2>&1
复制代码
注:这里前面一部分/usr/bin/php
表明服务器上PHP
的安装路径,后面一部分表明项目目录。
另外上面的命令前面的5个星号*分别表明分钟、小时、天、月、星期。
分钟:0-59的整数,默认星号和星号/1 表明1分钟。
小时:0-23的整数。
天:1-31的整数。
月:1-12的整数。
星期:0-7的整数,0和7都表明星期日。
crontab -l 能够列出当前的定时任务。数据库
七、启动任务sudo service cron restart
,打开FZ
,查看服务器上项目的根目录下的file.txt
文件中是否有时间写入而且每分钟执行一次。确认成功后,执行命令 service cron stop
和 exit
退出定时任务。后端
接下来要作的是把写入文件的操做换成定时发邮件。在.env
文件配置发邮件所需的相关信息。浏览器
MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
MAIL_USERNAME=发件人邮箱
MAIL_PASSWORD=发件人邮箱邮箱密码
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=发件人邮箱
MAIL_FROM_NAME=发件人名字
复制代码
一、打开web.php
,添加路由bash
$this->any('mail', 'HomeController@mail');//发邮件
复制代码
二、在Home
控制器中添加以下代码:服务器
public function mail()
{
//第一种方法
\Mail::raw('定时发送邮件 测试', function ($message) {
$message->from('发件人邮箱', '长乐未央');
$message->subject('邮件主题 测试');
$message->to('收件人邮箱');
});
//第二种方法
// \Mail::send('admin.mail', ['name' => 'holy'], function ($message) {
// $message->to('收件人邮箱');
// });
}
复制代码
测试:终端打印路由,拿到路由地址去浏览器中访问:http://你的二级域名/admin/mail
,查看邮箱是否收到邮件。若是成功收到邮件,请继续往下。。
三、打开任务类 SendEmail.php
文件,修改handle
方法,代码以下:
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('发件人邮箱', '发件人名字');
$message->subject('邮件主题 测试');
//执行发送
$message->bcc($customer->email);
}
});
}
复制代码
最后去服务器的当前项目中,启动定时命令 service cron restart
,等一分钟,查看邮箱是否收到邮件而且每一分钟执行一次。
当咱们要发的邮件量很大时,咱们就要使用到队列,把要发送的邮件所有存入队列,让后端去完成这个漫长的操做。网上不少资料都是使用数据库队列,我这里使用 redis
队列。
一、修改.env文件中的 QUEUE_DRIVER=sync
为 QUEUE_DRIVER=redis
二、启动队列,终端执行命令:redis-server
,你会发现predis
的扩展没装,执行命令:composer require predis/predis
安装便可。安装完成后,从新启动redis。
三、建立任务类:php artisan make:job SendReminderEmail
,运行成功后会在app/Jobs
目录下生成一个SendReminderEmail.php
,咱们修改其内容以下:
<?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('新功能发布');
});
}
}
复制代码
四、建立邮件局部视图resources/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>复制代码
一、在web.php
中添加以下路由:
Route::get('mail/sendReminderEmail/{id}','MailController@sendReminderEmail');
复制代码
二、建立控制器:php artisan make:controller MailController
,控制器中写入以下代码:
<?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));
}
}
复制代码
三、运行队列监听器。在浏览器中访问http://你的二级域名/mail/sendReminderEmail/1
,此时任务被推送到Redis
队列中。在命令行中运行以下命令:php artisan queue:work
,而后去查看邮箱会收到提醒邮件:
四、推送任务到指定队列,修改App\Console\Commands\SendEmail
里面的handle
方法代码以下:
public function handle()
{
\Mail::queue('定时发送邮件 测试', function ($message) {
//查出要发邮件的全部用户的邮箱
$customers = Customer::where('email', '<>', null)->get();
foreach ($customers as $customer) {
$message->from('244500972@qq.com', 'huangdj');
$message->subject('邮件主题 测试');
//执行发送
//$message->bcc($customer->email);
//将任务推送到指定队列并延迟一分钟执行
dispatch(new \App\Jobs\SendReminderEmail($customer->email))->onQueue('emails')->delay(60);
}
});
}
复制代码
终极测试:看邮箱是不是每隔一分钟收到一份邮件
启动:redis-server
启动:php artisan queue:work
启动定时执行:service cron restart
转至 长乐 http://itfun.tv 黄老师