thinkphp中使用计划任务 | 我的日常分享

thinkphp中使用计划任务

thinkphp中使用计划任务

一、需求

数据库有两个字段enter_time入驻时间与status状态,当入驻时间超过指定时间时,要求将状态设置为指定状态。

二、解决方案

方案1:使用计划任务,定时判断入驻时间是否超过指定时间。

github库:think-cron(https://github.com/yunwuxin/think-cron

1、安装think-cron

1
composer require yunwuxin/think-cron

版本原因安装失败,尝试使用:

1
composer require yunwuxin/think-cron:*

2、创建任务类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

namespace app\task;

use yunwuxin\cron\Task;

class DemoTask extends Task
{

public function configure()
{
$this->daily(); //设置任务的周期,每天执行一次,更多的方法可以查看源代码,都有注释
}

/**
* 执行任务
* @return mixed
*/
protected function execute()
{
//...具体的任务执行
}
}

新建一个目录task,再新建一个任务类。

image-20220624221700274

3、在配置文件中注册任务

image-20220624221809005

4、监听任务

方法一 (推荐)

起一个常驻进程,可以配合supervisor使用

1
php think cron:schedule

方法二

在系统的计划任务里添加

1
* * * * * php /path/to/think cron:run >> /dev/null 2>&1

补充:

1、使用以下命令,可执行一次任务。

1
php think cron:run

2、从源码中可以看到一共有两个命令

image-20220624222332960

3、可以了解到think-cron的计划任务逻辑

如下图,每60秒执行一遍php think cron:run,而在php think cron:run命令中判断当前执行时的时间是否满足条件,满足则执行任务。

image-20220624222457072

4、在windows环境

建议去掉Schedule.phpexecute函数中的start /B,否则当执行php think cron:schedule时,到时间会弹出弹窗询问是否打开文件,如下图。

image-20220624223014468