202 lines
5.4 KiB
PHP
202 lines
5.4 KiB
PHP
<?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 {
|
||
|
||
日志写入("发送失败 " . $结果,"错误");
|
||
}
|
||
|
||
}
|
||
|
||
|
||
日志写入("任务结束","提示");
|
||
日志写入(">>>==================================>>>","结束");
|
||
|
||
?>
|