为速度而生的Laravel框架 Lumen(四)-系统服务
Laravel 提供了很多出色的系统服务,提供很多解决方案,这次就带来几个比较常用而且好用的服务给大家。
任务调度
你的应用可能会需要用到大量的crontab任务,但是配置的系统中的crontab,再通过curl来调度明显很麻烦而且很难维护,这里Laravel提供了任务调度的系统服务* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
只需要配置一条crontab就能执行到你所有你想要的计划任务 你可以在 App\Console\Kernel 类的 schedule 方法中定义所有调度任务。
protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); }
可以设置多种时间的运行策略,非常灵活,可以满足你很多不同的需求
->cron('* * * * *'); 在自定义Cron调度上运行任务 ->everyMinute(); 每分钟运行一次任务 ->everyFiveMinutes(); 每五分钟运行一次任务 ->everyTenMinutes(); 每十分钟运行一次任务 ->everyThirtyMinutes(); 每三十分钟运行一次任务 ->hourly(); 每小时运行一次任务 ->daily(); 每天凌晨零点运行任务 ->dailyAt('13:00'); 每天13:00运行任务 ->twiceDaily(1, 13); 每天1:00 & 13:00运行任务 ->weekly(); 每周运行一次任务 ->monthly(); 每月运行一次任务 ->monthlyOn(4, '15:00'); 每月4号15:00运行一次任务 ->quarterly(); 每个季度运行一次 ->yearly(); 每年运行一次 ->timezone('America/New_York'); 设置时区
另外除了闭包调度外,还能通过命令的方式去执行你的任务
$schedule->command('emails:send --force')->daily(); $schedule->command(EmailsCommand::class, ['--force'])->daily();
任务的输出
为处理调度任务输出提供了多个方便的方法。首先,使用sendOutputTo 方法,你可以发送输出到文件
$schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);
这样就可以看到所需的日志了,不用再做一层逻辑
另外还可以用邮件还有钩子
$schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com');
使用 before 和 after 方法,你可以指定在调度任务完成之前和之后要执行的代码:
$schedule->command('emails:send') ->daily() ->before(function () { // 任务即将开始... }) ->after(function () { // 任务已经完成... });
邮件服务
基于 SwiftMailer 库提供了一套干净、清爽的邮件API。Laravel 为 SMTP、Mailgun、SparkPost、Amazon SES、PHP 的 mail 函数,以及sendmail 提供了驱动,从而允许你快速通过本地或云服务发送邮件。 由于篇幅关系,这里就只介绍一下如何通过Smtp发送邮件 现在.env的配置文件配置好smtp的信息MAIL_DRIVER=smtp //驱动 MAIL_HOST=smtp.qq.com smtp服务器地址 MAIL_PORT=465 //端口 MAIL_USERNAME=291190168@qq.com //用户名 MAIL_PASSWORD=eeicilllfyztbhia //密码 MAIL_ENCRYPTION=ssl //加密协议 MAIL_NAME=test1 //发送者名字 MAIL_ADDRESS=291190168@qq.com //发送者地址
简单的配置后 只需要简单的一行代码
Mail::send($view,$viewdata,function($message) use ($email, $title){ $to = $email; $message ->to($to)->subject($title);
这里要讲一下第一个参数是模板名字,第二个参数是模板变量,这样就可以组合出我们想要的html格式文本的邮件,当然也可以发送纯文本的:
Mail::raw($msg,function($message) use ($email, $title){ $to = $email; $message ->to($to)->subject($title); });
不过有一个坑,是如何补抓到邮件发送成功还是失败呢?我踩了一个坑,这里是不会返回true false的,如果要改源码的话,工程非常的大,那么我们只能用try catch来补抓了,这是个小坑。
总结:合理运用框架上的扩展和服务能够有效减少我们的工作量,但是这也是一把双刃剑,对于我们自身业务的拓展以及灵活性有可能会大大的降低,如何把这些服务运用灵活和减少代码的耦合是我们使用前所需要考虑的。