一、定時任務腳本編寫
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,