Files
Fuxsto-V4/Main/System/ExpiryReminder.php.bak
2025-10-18 10:19:37 +08:00

202 lines
5.4 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
include_once "../Hv4.Function.php";
/**
* 高频日志写入解决方案(线程安全+按天分割+自动清理)
* @param string $content 日志内容
* @param string $type 日志类型INFO/WARNING/ERROR等
*/
function 日志写入($content, $type = 'INFO') {
// 配置参数(可根据需求调整)
$config = [
'log_dir' => './Log/ExpiryReminder', // 日志目录
'retain_days' => 60, // 日志保留天数改为60天清理
'file_prefix' => 'ExpiryReminder' // 日志文件前缀
];
// 生成时间相关变量
$now = new DateTime();
$currentDate = $now->format('Y-m-d');
$logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate);
// 自动创建日志目录
if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) {
error_log("无法创建日志目录: {$config['log_dir']}");
return;
}
// 构建日志内容(含毫秒时间戳)
$timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000);
$logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content);
// 高性能写入(使用资源句柄+flock避免并发冲突
try {
$handle = fopen($logFile, 'a'); // 追加模式打开
if (flock($handle, LOCK_EX)) { // 获取独占锁
fwrite($handle, $logLine);
flock($handle, LOCK_UN); // 释放锁
}
fclose($handle);
} catch (Exception $e) {
error_log("日志写入失败: " . $e->getMessage());
}
// 控制台输出(可选调试)
echo $logLine;
// 智能清理(每天只执行一次清理检查)
$cleanFlagFile = $config['log_dir'] . '/.last_clean';
if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) {
$expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp();
foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) {
if (filemtime($file) < $expireDate) {
@unlink($file);
}
}
touch($cleanFlagFile); // 更新清理标记时间
}
}
日志写入(">>>==================================>>>","提示");
日志写入("预修复数据中","提示");
$语句 = "UPDATE purchases
SET status = 'activated'
WHERE
status = 'expiring'
AND expiry_time > CURDATE() + INTERVAL 7 DAY
";
$Q = @数据库运行($语句);
日志写入("CODE ".$Q,"提示");
日志写入(">>>==================================>>>","提示");
$语句 = "SELECT *
FROM purchases
WHERE
(
(expiry_time >= CURDATE()
AND expiry_time < CURDATE() + INTERVAL 8 DAY)
OR
expiry_time < NOW()
)
AND status != 'expired' -- 现在这个条件会全局生效
ORDER BY expiry_time
";
日志写入(">>>==================================>>>","执行中");
日志写入("ExpiryReminder 任务开始","提示");
日志写入("查询中","提示");
$结果 = @数据库运行($语句);
if (!$结果) {
日志写入("无结果","提示");
die();
}
日志写入("查询结果","提示");
日志写入(">>>==================================>>>","结果");
日志写入(@转JSON($结果),"数据");
日志写入(">>>==================================>>>","结果");
日志写入("开始循环","提示");
foreach ($结果 as $数据) {
日志写入(">>>==================================>>>","任务");
$用户ID = $数据["user_id"];
$业务ID = $数据["purchase_id"];
$业务状态 = $数据["status"];
$业务名称 = $数据["name"];
$到期时间 = $数据["expiry_time"];
日志写入("提取业务ID ".$业务ID,"提示");
日志写入("提取用户ID ".$用户ID,"提示");
日志写入("提取业务状态 ".$业务状态,"提示");
$dateString = $到期时间;
// 创建目标日期对象并设置时间为0点
$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString);
$targetDate->setTime(0, 0, 0);
// 创建当前日期对象并设置时间为0点
$today = new DateTime();
$today->setTime(0, 0, 0);
// 计算日期差异
$interval = $today->diff($targetDate);
// 获取天数差
$剩余天数 = $interval->days;
// 处理过去或未来的情况
if ($interval->invert) {
$剩余天数 = -$剩余天数;
}
$语句 = "SELECT * FROM users WHERE id = $用户ID;";
$用户数据 = @数据库运行($语句);
$用户数据 = @reset($用户数据);
$QQ = $用户数据["qq"];
if ($业务状态 != "expiring") {
$语句 = "UPDATE purchases
SET status = 'expiring'
WHERE purchase_id = '$业务ID';
";
@数据库运行($语句);
日志写入("业务状态已更新","成功");
} else {
日志写入("业务状态无需更新","成功");
}
日志写入("获取邮件模板","提示");
$邮件模板 = @file_get_contents("./Res/ExpiryReminder.html");
$search = ["[到期时间]", "[业务名称]", "[剩余天数]", "[业务ID]"];
$replace = [$到期时间, $业务名称, $剩余天数, $业务ID];
$邮件模板 = str_replace($search, $replace, $邮件模板);
日志写入("正在发送邮件","提示");
$结果 = 发送邮件接口(
$QQ.'@qq.com',
'关于业务的重要通知',
$邮件模板
);
if ($结果 === 200) {
日志写入("已发送","成功");
} else {
日志写入("发送失败 " . $结果,"错误");
}
}
日志写入("任务结束","提示");
日志写入(">>>==================================>>>","结束");
?>