摘要:导语之前写过使用的进行定时任务,实际上也可以执行定时任务。需求是统计每日访问的数,虽然数据表中有数据,为了演示,新建监听器统计。记录这篇文章中介绍了实现了事件监听器,在此基础上进行扩展。
导语
之前写过使用 Linux 的进行定时任务,实际上 laravel 也可以执行定时任务。需求是统计每日访问的 IP 数,虽然数据表中有数据,为了演示,新建监听器统计。
记录 IP这篇文章中介绍了实现了事件/监听器,在此基础上进行扩展。
注册一个新的监听器,在 app/Providers/EventServiceProvider.php 文件中新添加 CreateUserIpLog
/** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], "AppEventsUserBrowse" => [ "AppListenersCreateBrowseLog",// 用户访问记录 "AppListenersCreateUserIpLog",// 用户 IP 记录 ], ];
添加完成后执行 php artisan event:generate,创建好了 app/Listeners/CreateUserIpLog.php 文件;
在新建监听器中,记录用户的 IP,使用 Redis 的 Set 数据类型进行记录,代码如下
/** * Handle the event. * 记录用户 IP * @param UserBrowse $event * @return void */ public function handle(UserBrowse $event) { $redis = Redis::connection("cache"); $redisKey = "user_ip:" . Carbon::today()->format("Y-m-d"); $isExists = $redis->exists($redisKey); $redis->sadd($redisKey, $event->ip_addr); if (!$isExists) { // key 不存在,说明是当天第一次存储,设置过期时间三天 $redis->expire($redisKey, 259200); } }统计访问
上面将用户的 IP 记录下来,然后就是编写统计代码
新建一个任务 php artisan make:command CountIpDay,新建了 app/Console/Commands/CountIpDay.php 文件;
设置签名 protected $signature = "countIp:day"; 和描述 protected $description = "统计每日访问 IP";
在 handle 方法中编写代码,也可以在 kernel.php 中使用 emailOutputTo 方法发送邮件
/** * Execute the console command. * * @return mixed */ public function handle() { $redis = Redis::connection("cache"); $yesterday = Carbon::yesterday()->format("Y-m-d"); $redisKey = "user_ip:" . $yesterday; $data = $yesterday . " 访问 IP 总数为 " . $redis->scard($redisKey); // 发送邮件 Mail::to(env("ADMIN_EMAIL"))->send(new SendSystemInfo($data)); }设置任务调度
编辑 app/Console/Kernel.php 的 $commands
/** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ AppConsoleCommandsCountIpDay::class, ];
在 schedule 方法中设置定时任务,执行时间为每天凌晨一点
/** * Define the application"s command schedule. * * @param IlluminateConsoleSchedulingSchedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command("countIp:day")->dailyAt("1:00"); }
最后是在 Linux 中添加定时任务,每分钟执行一次 artisan schedule:run,如下
* * * * * /you_php you_path/artisan schedule:run >> /dev/null 2>&1
参考资料:laravel 任务调度、Laravel定时任务调度例子——统计每周新增的用户数量
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/31206.html
摘要:如果任务没有在规定时间内完成,那么该有序集合的任务将会被重新放入队列中。这两个进程操纵了三个队列,其中一个,负责即时任务,两个,负责延时任务与待处理任务。如果任务执行成功,就会删除中的任务,否则会被重新放入队列中。 在实际的项目开发中,我们经常会遇到需要轻量级队列的情形,例如发短信、发邮件等,这些任务不足以使用 kafka、RabbitMQ 等重量级的消息队列,但是又的确需要异步、重试...
摘要:高性能高精度定时服务,轻松管理千万级定时任务。支持任务到期触发和。支持创建延时任务和定时到期任务,和原生保持相同接口,轻松使用。不支持任务输出任务钩子及维护模式。是不指定任务名时自动生成,每个任务名必须唯一,相同任务名重复定义将会自动覆盖。 Forsun高性能高精度定时服务,轻松管理千万级定时任务。 定时服务项目地址:https://github.com/snower/forsun l...
摘要:所以在这里创建一个事件的两个实际方法是通过调用或,第一个提交一个的实例,后者提交来做一些特殊处理。那么会用表达式检查命令是否到期吗恰恰相反,使用库来确定命令是否基于当前系统时间相对于我们设置的时区。 译文GitHub https://github.com/yuansir/diving-laravel-zh 原文链接 https://divinglaravel.com/task-sche...
摘要:表示该工作应该在每个月日上午运行这里还有一些其他的示例表示工作应该在星期三每分钟运行一次。表示该工作应该每天在凌晨点和点运行两次。方法调用的实例作为唯一的参数,这是用于记录您提供的作业的计划任务管理器,并决定每次守护进程应该运行什么。 译文GitHub https://github.com/yuansir/diving-laravel-zh 原文链接 https://divinglar...
阅读 1046·2021-11-25 09:43
阅读 678·2021-11-22 14:45
阅读 3792·2021-09-30 09:48
阅读 1039·2021-08-31 09:41
阅读 1948·2019-08-30 13:52
阅读 1958·2019-08-30 11:24
阅读 1318·2019-08-30 11:07
阅读 917·2019-08-29 12:15