美文网首页
laravel 任务调度实例

laravel 任务调度实例

作者: haoyq | 来源:发表于2019-01-21 13:23 被阅读0次

导语

之前写过使用 Linux 的进行定时任务,实际上 laravel 也可以执行定时任务。需求是统计每日访问的 IP 数,虽然数据表中有数据,为了演示,新建监听器统计。

记录 IP

这篇文章中介绍了实现了事件/监听器,在此基础上进行扩展。

  1. 注册一个新的监听器,在 app/Providers/EventServiceProvider.php 文件中新添加 CreateUserIpLog
/**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        'App\Events\UserBrowse' => [
            'App\Listeners\CreateBrowseLog',// 用户访问记录
            'App\Listeners\CreateUserIpLog',// 用户 IP 记录
        ],
    ];

添加完成后执行 php artisan event:generate,创建好了 app/Listeners/CreateUserIpLog.php 文件;

  1. 在新建监听器中,记录用户的 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 记录下来,然后就是编写统计代码

  1. 新建一个任务 php artisan make:command CountIpDay,新建了 app/Console/Commands/CountIpDay.php 文件;
  2. 设置签名 protected $signature = 'countIp:day'; 和描述 protected $description = '统计每日访问 IP';
  3. 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));
    }

设置任务调度

  1. 编辑 app/Console/Kernel.php$commands
/**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\CountIpDay::class,
    ];
  1. schedule 方法中设置定时任务,执行时间为每天凌晨一点
/**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('countIp:day')->dailyAt('1:00');
    }
  1. 在 Linux 中添加定时,执行 crontab -e 后添加
    * * * * * /you_php you_path/artisan schedule:run >> /dev/null 2>&1

结语

所有步骤都已经完成,经过测试也没有问题。


参考资料:laravel 任务调度Laravel定时任务调度例子——统计每周新增的用户数量

相关文章

  • laravel 任务调度实例

    导语 之前写过使用 Linux 的进行定时任务,实际上 laravel 也可以执行定时任务。需求是统计每日访问的 ...

  • Laravel 任务调度问题

    换地方了 Laravel 任务调度问题

  • laravel 任务调度

    1.在代码里面写调度任务,在Console文件夹下面Kernel.php写调取任务命令 2.在Commands文件...

  • laravel 任务调度

    创建定时任务文件 编辑文件内容 修改Kernel 文件 添加定时任务

  • laravel任务调度

    crontab -e #添加代码 * * * * * /usr/bin/php7.0 /var/www/html/...

  • laravel 调度任务

    larave 一直是国内外备受欢迎的框架,功能强大、结构优雅,其中 artisan 命令 也一直备受青睐。接下来就...

  • laravel任务调度

    1.创建定时任务 编写以下cron语句: /usr/bin/php为PHP路径,/www/wwwroot/guxi...

  • 30. 配置 Cron 调度器

    Laravel 提供了便利的方式来调度 Cron 任务,通过Artisan 命令 schedule:run ,调度...

  • Laravel 任务调度 ( Console )

    在以前, 开发者需要为每一个需要调度的任务编写一个 Cron 条目, 这是很让人头疼的事. 你的任务调度不在源码控...

  • laravel之任务调度

    之前执行任务定时,都会用linux的crontab,现在框架用一条就可以帮你去执行了 增加定时 定义调度 场景:订...

网友评论

      本文标题:laravel 任务调度实例

      本文链接:https://www.haomeiwen.com/subject/jtwqjqtx.html