\"$rutaSql\" 2>&1";
exec($comando, $salida, $resultado);
if ($resultado !== 0) {
echo "
Error al generar la base de datos. Abortando.
";
exit;
}
// --- EMPAQUETADO ZIP ---
$nombreArchivoZip = "backup_completo_" . $fecha . ".zip";
$rutaZip = $carpetaDestino . $nombreArchivoZip;
$zip = new ZipArchive();
if ($zip->open($rutaZip, ZipArchive::CREATE) === TRUE) {
// Guardamos la base de datos dentro del ZIP
$zip->addFile($rutaSql, $nombreArchivoSql);
// Guardamos el archivo de conexión
$rutaConexion = $rutaProyecto . "php\\conexion.php";
if (file_exists($rutaConexion)) {
$zip->addFile($rutaConexion, "php/conexion.php");
}
// Guardamos el bot de Python
$rutaBot = $rutaProyecto . "python\\Enviar_WSP.py";
if (file_exists($rutaBot)) {
$zip->addFile($rutaBot, "python/Enviar_WSP.py");
}
// Guardamos la carpeta uploads completa
$rutaUploads = $rutaProyecto . "uploads\\";
// Verificamos si la carpeta existe antes de intentar abrirla
if (is_dir($rutaUploads)) {
// El sabueso que busca todos los archivos dentro de la carpeta
$archivos = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rutaUploads),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($archivos as $nombre => $archivo) {
// Saltamos las carpetas vacías o los directorios del sistema (. y ..)
if (!$archivo->isDir()) {
// Obtenemos la ruta real del archivo en Windows
$rutaReal = $archivo->getRealPath();
// Calculamos la ruta relativa para que adentro del ZIP quede ordenado en "uploads/comprobantes/foto.jpg"
$rutaRelativa = "uploads/" . substr($rutaReal, strlen($rutaUploads));
// Reemplazamos las barras invertidas de Windows por barras normales para el ZIP
$rutaRelativa = str_replace('\\', '/', $rutaRelativa);
// Añadimos el archivo al ZIP
$zip->addFile($rutaReal, $rutaRelativa);
}
}
}
$zip->close();
// Borramos el archivo .sql suelto
unlink($rutaSql);
echo "¡Éxito! Backup COMPLETO generado correctamente.
";
echo "Ruta: " . $rutaZip . "
";
} else {
echo "Error al intentar crear el archivo ZIP.
";
}
// --- AUTO-LIMPIEZA DE BACKUPS VIEJOS ---
$archivosZip = glob($carpetaDestino . "*.zip");
$fechaActual = time();
$borrados = 0;
foreach ($archivosZip as $archivo) {
if (is_file($archivo)) {
$diasDeAntiguedad = ($fechaActual - filemtime($archivo)) / (60 * 60 * 24);
if ($diasDeAntiguedad >= $diasDeRetencion) {
unlink($archivo);
$borrados++;
}
}
}
echo "
";
if ($borrados > 0) {
echo "Limpieza completada: Se eliminaron $borrados backup(s) viejo(s).
";
} else {
echo "Mantenimiento al día: Ningún backup supera los $diasDeRetencion días.
";
}
?>