From 1bd51cbcdfce711e0dda2bba21c33b8d7382833a Mon Sep 17 00:00:00 2001 From: ypsdf1 Date: Mon, 5 Oct 2026 13:41:17 +0800 Subject: [PATCH] =?UTF-8?q?log=5Fmaintain=20=E5=8A=A0=204.5MB=20=E6=B0=B4?= =?UTF-8?q?=E4=BD=8D=E7=BA=BF=EF=BC=9A=E9=81=BF=E5=85=8D=E6=B8=85=E7=90=86?= =?UTF-8?q?=E5=90=8E=E8=B4=B4=E7=9D=80=205MB=20=E4=B8=8A=E9=99=90=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=AF=8F=E6=AC=A1=E5=86=99=E5=85=A5=E9=83=BD=E5=85=A8?= =?UTF-8?q?=E9=87=8F=E9=87=8D=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- log_maintain.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/log_maintain.php b/log_maintain.php index 230f3a4..6713aa5 100644 --- a/log_maintain.php +++ b/log_maintain.php @@ -5,6 +5,8 @@ * 规则(两条同时满足才算干净,达成任一条超标即触发清理): * 1. 只保留最近 3 天的日志行(按行首 [Y-m-d H:i:s] 时间戳判断); * 2. 文件总大小 ≤ 5MB。 + * 清理时大小目标压到 4.5MB 水位线(90%),留 0.5MB 缓冲——否则压到 5MB 上限后 + * 下一条日志写入即再次超标,会造成「每次写入都全量重建」的 I/O 放大。 * * 设计要点: * - 自包含:不依赖 core.php / config.php(captcha_guard、poller 等独立入口都能用); @@ -79,14 +81,17 @@ function logMaintainRebuild($fh, $logFile, $maxBytes, $cutoff) { fclose($out); clearstatcache(true, $tmp); - // ===== 第二步:剩余仍超 5MB → 从最旧端按整行丢弃到 ≤ maxBytes ===== - $skipBytes = ($kept > $maxBytes) ? ($kept - $maxBytes) : 0; + // ===== 第二步:剩余仍超水位线 → 从最旧端按整行丢弃到 ≤ 90% maxBytes ===== + // 水位线(4.5MB)留 0.5MB 缓冲:若压到 5MB 上限,下一条日志写入即再次超标, + // 会导致「每次写入都全量重建」的 I/O 放大;留缓冲后常态每 ~2500 条日志才重建一次。 + $target = (int) ($maxBytes * 9 / 10); + $skipBytes = ($kept > $target) ? ($kept - $target) : 0; $in = @fopen($tmp, 'rb'); if (!$in) { @unlink($tmp); return false; } if ($skipBytes > 0) { $acc = 0; - // 逐行累计丢弃;按整行丢,最终大小 kept-acc 必 ≤ maxBytes + // 逐行累计丢弃;按整行丢,最终大小 kept-acc 必 ≤ target while ($acc < $skipBytes && ($line = fgets($in)) !== false) { $acc += strlen($line); }