当前位置: 首页 > backend >正文

宝塔+fastadmin:给项目添加定时任务

一、定时任务脚本编写

1. 使用 shebang 声明执行器

#!/usr/bin/env php
  • 这是 Unix/Linux 系统中脚本文件的标准开头。
  • 表示这个脚本使用系统环境变量中的 php 来执行。

2. 定义 ThinkPHP 入口路径并加载框架

define('APP_PATH', __DIR__ . '/../../application/');
require __DIR__ . '/../../thinkphp/start.php';
  • APP_PATH:定义了项目的入口目录。
  • 加载 ThinkPHP 框架,使你可以使用 Db 类、模型等功能。

3. 引入 ThinkPHP 的数据库类

use think\Db;
  • 方便后续操作数据库。

4. 判断是否是周一的方法

function isMonday() {return date('w') == 1;
}
  • 使用 date('w') 获取当前星期几:
    • 0 = 周日
    • 1 = 周一 ✅
  • 所以这个函数返回 true 表示今天是 周一

5. 获取上周的周标识(格式如:2025-W20)

function getLastWeekIdentifier() {$last_week = strtotime("-1 week");$year = date("Y", $last_week);$week = date("W", $last_week);return "{$year}-W{$week}";
}
  • strtotime("-1 week"):获取上周同一时间的时间戳
  • date("W", ...):ISO-8601 周数(从 1 开始)
  • 返回值示例:2025-W20

6. 日志记录函数

function logMessage($message) {$logFile = __DIR__ . "/update_log.txt";file_put_contents($logFile, "【" . date('Y-m-d H:i:s') . "】" . $message . "\n",     FILE_APPEND);
}
  • 把每次运行的信息写入日志文件 update_log.txt
  • 便于调试和查看执行情况

🧱 主逻辑部分(try-catch 包裹)

try {

用 try-catch 包裹整个逻辑,确保出错时能捕获异常并记录日志。


7. 判断是否是周一

if (!isMonday()) {logMessage("不是周一,跳过任务");exit("不是周一,跳过任务\n");
}
  • 如果不是周一,直接退出程序,不执行更新操作

8. 获取上周标识并记录日志

$lastWeek = getLastWeekIdentifier();
logMessage("🔍正在处理上周周标识:{$lastWeek}");
  • 获取上周的周标识(如 2025-W20
  • 记录日志方便后续查看

9. 查询上周的数据

$records = Db::table('weekly_emitem_apply_setting')
->where('week', $lastWeek)
->select();
  • 查询所有 week = '2025-W20' 的记录
  • 准备进行字段更新

10. 遍历每条记录并处理

foreach ($records as $record) {$id = $record['id'];$employee_num = $record['employee_num'];$item_no = $record['item_no'];$actual_total = $record['actual_total_qty'];$week_apply = $record['week_apply_qty'];
  • 提取每条记录的关键字段
  • 如员工编号、料号、累计数量、本周申请量等

11. 计算新的累计数量

$newTotal = $actual_total + $week_apply;
  • 将本周申请量累加到累计数量中

12. 获取当前周标识(如:2025-W21)

$currentWeek = date("Y") . "-W" . str_pad((int)date("W"), 2, 
http://www.xdnf.cn/news/7674.html

相关文章:

  • Spring Boot 使用 jasypt配置明文密码加密
  • 第6章 C控制语句:循环
  • 攻防世界-题目名称-文件包含
  • MySQL 库的操作 -- 字符集和校验规则,库的增删查改,数据库的备份和还原
  • Java IO流操作
  • Prosys OPC:引领工业互联的OPC UA先锋
  • 游戏引擎学习第296天:层的雾效和透明度
  • 基于Spring Boot + Vue的教师工作量管理系统设计与实现
  • 监控易一体化运维:解锁工单管理效能,为运维工作提速
  • ZooKeeper 原理解析及优劣比较
  • 安达发|传统排产已过时?AI机器人+APS高级排产软件重塑制造业!
  • docker 查看镜像所在位置
  • Index-AniSora论文速读:探索Sora时代动画视频生成的前沿
  • Qt中解决Tcp粘包问题
  • Runtipi - 开源个人家庭服务器管理工具
  • C#调用GTS控制板
  • DeepSeek+PiscTrace+YOLO:迅速实现Mask掩码抠图
  • IEEE 802.1Q协议下封装的VLAN数据帧格式
  • 【ISP算法精粹】什么是global tone mapping和local tone mapping?
  • 异步复位,同步释放
  • FineBI 和 Axure工具比较——数据分析VS原型设计
  • 常见回归损失函数详解:L1 Loss, L2 Loss, Huber Loss
  • 能碳一体化的核心功能模块
  • 【图像大模型】Kolors:基于自监督学习的通用视觉色彩增强系统深度解析
  • 抓包分析工具与流量监控软件
  • C语言入门
  • SQLite基础及优化
  • 从0到1搭建shopee测评自养号系统:独立IP+硬件伪装+养号周期管理​
  • [概率论基本概念1]什么是经验分布
  • 【NLP 76、Faiss 向量数据库】