yazrkisvs3vvvsv33svrhetrjsvyvsvvyjsvsvs
tavsuysvssvvjvvyjyjkvsvqd
qfogsvvsvsegjdgdfgdskhgdksvqsvshdqsd
<?php
// api/cache-purge.php — Purga automática de dm_cache y logs
// Cron diario (ej. 3:30AM, después del metrics-snapshot):
// 30 3 * * * /usr/local/bin/php /home/dimark93/public_html/supercerebro/api/cache-purge.php >> logs/cache-purge.log 2>&1
//
// También ejecutable vía HTTP con ?token=CRON_SECRET

require_once __DIR__ . '/../config.php';
require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/../credentials.php';

// ── Auth ──────────────────────────────────────────────────────────────────────
$is_cli     = php_sapi_name() === 'cli';
$cron_token = defined('CRON_SECRET') ? CRON_SECRET : '';
$req_token  = $_GET['token'] ?? ($_SERVER['HTTP_X_CRON_TOKEN'] ?? '');

if (!$is_cli && (!$cron_token || $req_token !== $cron_token)) {
    http_response_code(403);
    echo json_encode(['ok' => false, 'error' => 'Forbidden']);
    exit;
}

if (!$is_cli) header('Content-Type: application/json');

if (!$pdo) {
    echo json_encode(['ok' => false, 'error' => 'Sin conexión a BD']);
    exit;
}

$started = microtime(true);
$result  = ['ok' => true, 'ran_at' => date('Y-m-d H:i:s'), 'purged' => []];

// ── 1. dm_cache — entradas expiradas ─────────────────────────────────────────
// TTL definido en credentials.php (dm_cache_set por defecto 30 min)
// Aquí eliminamos todo lo que expiró hace más de 1 hora (margen de seguridad)
try {
    $stmt  = $pdo->prepare("DELETE FROM dm_cache WHERE expires_at < DATE_SUB(NOW(), INTERVAL 1 HOUR)");
    $stmt->execute();
    $cache_purged = $stmt->rowCount();
    $result['purged']['dm_cache_expired'] = $cache_purged;
} catch (Exception $e) {
    $result['purged']['dm_cache_expired'] = 'ERROR: ' . $e->getMessage();
}

// ── 2. dm_metrics_history — snapshots con más de 90 días ─────────────────────
// Mantenemos 90 días de histórico (suficiente para comparativas y gráficas)
try {
    $stmt = $pdo->prepare("DELETE FROM dm_metrics_history WHERE metric_date < DATE_SUB(CURDATE(), INTERVAL 90 DAY)");
    $stmt->execute();
    $result['purged']['dm_metrics_history_old'] = $stmt->rowCount();
} catch (Exception $e) {
    $result['purged']['dm_metrics_history_old'] = 'ERROR: ' . $e->getMessage();
}

// ── 3. dm_activity — logs con más de 180 días ────────────────────────────────
try {
    $stmt = $pdo->prepare("DELETE FROM dm_activity WHERE created_at < DATE_SUB(NOW(), INTERVAL 180 DAY)");
    $stmt->execute();
    $result['purged']['dm_activity_old'] = $stmt->rowCount();
} catch (Exception $e) {
    $result['purged']['dm_activity_old'] = 'ERROR: ' . $e->getMessage();
}

// ── 4. Archivos de log en disco — rotar si > 10 MB ───────────────────────────
$log_dir = __DIR__ . '/../logs';
$rotated = [];
if (is_dir($log_dir)) {
    foreach (glob($log_dir . '/*.log') as $logfile) {
        if (filesize($logfile) > 10 * 1024 * 1024) { // 10 MB
            $backup = $logfile . '.' . date('Ymd');
            rename($logfile, $backup);
            file_put_contents($logfile, ''); // archivo nuevo vacío
            $rotated[] = basename($logfile);
        }
    }
}
$result['purged']['logs_rotated'] = $rotated;

$result['elapsed_s'] = round(microtime(true) - $started, 3);
echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
