.log.1 (eine * vorhandene .1 wird ersetzt) und das aktive Log startet leer. Damit bleiben * höchstens zwei Generationen pro Log liegen — genug zum Nachsehen, ohne dass * spam.log oder php-errors.log auf dem Shared Hosting unbegrenzt wachsen. * * Aufruf: php bin/log-rotate.php [--max-mb=2] */ if (PHP_SAPI !== 'cli') { exit(1); } require dirname(__DIR__) . '/app/bootstrap.php'; $maxMb = 2.0; foreach ($argv as $arg) { if (preg_match('/^--max-mb=([0-9.]+)$/', $arg, $m) === 1) { $maxMb = (float) $m[1]; } } $limit = (int) ($maxMb * 1024 * 1024); $rotated = 0; foreach (glob(STORAGE_PATH . '/logs/*.log') ?: [] as $log) { $size = (int) @filesize($log); if ($size <= $limit) { continue; } if (!@rename($log, $log . '.1')) { fwrite(STDERR, 'Rotation fehlgeschlagen: ' . basename($log) . "\n"); continue; } // Neue, leere Datei mit denselben Rechten anlegen, damit PHP/Cron weiterschreiben können. @touch($log); @chmod($log, 0664); echo 'rotiert: ' . basename($log) . ' (' . round($size / 1048576, 1) . " MB)\n"; $rotated++; } echo $rotated === 0 ? "Nichts zu rotieren (alle Logs unter {$maxMb} MB).\n" : "{$rotated} Log(s) rotiert.\n";