++ consolidamento funzionalità Backup
This commit is contained in:
96
app/Console/Commands/BackupCleanup.php
Normal file
96
app/Console/Commands/BackupCleanup.php
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
/**
|
||||
* Rimuove gli archivi di backup e i pacchetti caricati piu' vecchi di un
|
||||
* giorno.
|
||||
*
|
||||
* Sono file grossi che vivono nel volume `storage_data`, lo stesso dei PDF dei
|
||||
* territori: un download mai completato o un ripristino interrotto ne lascia
|
||||
* uno indietro, e senza pulizia si accumulano finche' il volume non si riempie
|
||||
* — a quel punto smettono di funzionare anche l'import dei PDF e i log.
|
||||
*
|
||||
* La creazione di un nuovo backup fa gia' la sua pulizia, ma solo se qualcuno
|
||||
* ne crea uno: un'installazione che non tocca piu' la pagina resterebbe con i
|
||||
* residui addosso per sempre. Da qui il task pianificato.
|
||||
*/
|
||||
class BackupCleanup extends Command
|
||||
{
|
||||
protected $signature = 'backup:cleanup {--ore=24 : Eta minima, in ore, dei file da rimuovere}';
|
||||
|
||||
protected $description = 'Rimuove archivi di backup e pacchetti di ripristino piu\' vecchi di N ore';
|
||||
|
||||
/** Cartelle sotto storage/app in cui vivono i file temporanei del backup. */
|
||||
private const CARTELLE = [
|
||||
'backups' => '*.zip',
|
||||
'backup-restore-in' => '*.zip',
|
||||
];
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$ore = max(1, (int) $this->option('ore'));
|
||||
$limite = now()->subHours($ore)->getTimestamp();
|
||||
|
||||
$rimossi = 0;
|
||||
$liberati = 0;
|
||||
|
||||
foreach (self::CARTELLE as $cartella => $pattern) {
|
||||
$percorso = storage_path('app/' . $cartella);
|
||||
|
||||
if (! is_dir($percorso)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (glob($percorso . '/' . $pattern) ?: [] as $file) {
|
||||
if (filemtime($file) >= $limite) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$dimensione = filesize($file) ?: 0;
|
||||
|
||||
if (@unlink($file)) {
|
||||
$rimossi++;
|
||||
$liberati += $dimensione;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Le cartelle di staging del ripristino: il job le cancella nel
|
||||
// finally, ma un processo ucciso a meta' non arriva a eseguirlo.
|
||||
$staging = storage_path('app/backup-restore');
|
||||
if (is_dir($staging)) {
|
||||
foreach (glob($staging . '/*', GLOB_ONLYDIR) ?: [] as $dir) {
|
||||
if (filemtime($dir) < $limite) {
|
||||
$this->rimuoviCartella($dir);
|
||||
$rimossi++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->info(sprintf(
|
||||
'Pulizia backup: %d elementi rimossi, %.1f MB liberati.',
|
||||
$rimossi,
|
||||
$liberati / 1048576
|
||||
));
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
|
||||
private function rimuoviCartella(string $path): void
|
||||
{
|
||||
$iterator = new \RecursiveIteratorIterator(
|
||||
new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS),
|
||||
\RecursiveIteratorIterator::CHILD_FIRST
|
||||
);
|
||||
|
||||
foreach ($iterator as $item) {
|
||||
/** @var \SplFileInfo $item */
|
||||
$item->isDir() ? @rmdir($item->getPathname()) : @unlink($item->getPathname());
|
||||
}
|
||||
|
||||
@rmdir($path);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user