- Home
- Categorie
- Coding e Sistemistica
- PHP
- [Tutorial] Funzioni GZ con PHP
-
[Tutorial] Funzioni GZ con PHP
dopo la penalizzazione avvenuta nei mesi scorsi agli spinoff di couponing dei quotidiani online in inghilterra e in usa, possiamo attenderci che accada qualche cosa anche negli paesi europei? inclusa l'Italia? con i vari:
https://www.ansa.it/codici-sconto/
https://www.focus.it/codice-sconto/
https://www.repubblica.it/codici-sconto/
https://www.gazzetta.it/codici-sconto/
https://codicesconto.corriere.it/codice-sconto/
https://descuentos.elpais.com/
https://gutscheine.spiegel.de/... giusto per citarne alcuni
-
Questa ulteriore classe, descrive come gestire più files in un'unico archivio
mediante serializzazione:<?php class gz_archive { /* Inizializza le variabili */ var $source; var $dest; var $level; var $pointer; var $gzdata; var $data; var $status = TRUE; var $key = 0; var $files = array(); var $contents; var $count; var $fcontents; var $path; function gz_archive($path) { $this->path = $path; } function compress($source, $level) { /* Inizializza le variabili */ $this->source = $source; $this->level = $level; /* Controlla che $this->source sia un array */ if(!is_array($this->source)) exit("The source input must be an array"); /* Controlla che i files indicati nell'array esistano */ foreach($this->source AS $key => $value) { if(!is_file($this->source[$key])) exit(print_R($this->source[$key]) . " isn't a file"); } /* Arrotonda il livello di compressione */ $this->level = round($this->level); /* Controlla il livello e se è troppo grande, lo porta al massimo */ if($this->level == 'MAX' OR $this->level > 9) $this->level = 9; /* Controlla il livello e se è troppo piccolo, lo porta al minimo */ if($this->level == 'MIN' OR $this->level < 0) $this->level = 0; /* Crea un array nel quale ci sarà il contenuto dei files */ $this->count = count($this->source); while($this->data = file_get_contents($this->source[$this->key])) { print $this->data; $this->fcontents[$this->source[$this->key]] = $this->data; $this->key++; if($this->key >= $this->count) break; } /* Serializza l'array */ $this->data = serialize($this->fcontents); /* Comprime i dati del file d'origine */ $this->gzdata = gzcompress($this->data, $this->level); /* Scrive i dati compressi nel file di destinazione */ $this->status = file_put_contents($this->path, $this->gzdata); /* Ritorna i valori positivi e negativi in base all'esito dell'operazione */ if($this->status) return TRUE; else return FALSE; } function decompress() { /* Controlla se il file esiste o meno */ if(!is_file($this->path)) exit("File doesn't exists"); /* Riceve l'array */ $this->data = file_get_contents($this->path) or exit("Cannot read the file"); /* Lo decomprime */ $this->data = gzuncompress($this->data); /* E restituisce l'array */ $this->data = unserialize($this->data); /* Installa i files */ foreach($this->data AS $filename => $contents) { print $contents; if(!file_put_contents($filename, $contents)) $this->status = FALSE; } /* Ritorna i valori positivi e negativi in base all'esito dell'operazione */ if($this->status) return TRUE; else return FALSE; } } ?>
Il funzionamento è più o meno simile rispetto a quello della classe precedente, qui spiegherò
le differenze... Trattiamo prima la compressione:/* Controlla che $this->source sia un array */ if(!is_array($this->source)) exit("The source input must be an array"); /* Controlla che i files indicati nell'array esistano */ foreach($this->source AS $key => $value) { if(!is_readable($this->source[$key])) exit(print_R($this->source[$key]) . " isn't a file or is't readable"); }
due controlli: Il primo controlla che $this->source sia un'array,
il secondo, che i percorsi indicati in esso siano leggibili./* Crea un array nel quale ci sarà il contenuto dei files */ $this->count = count($this->source); while($this->data = file_get_contents($this->source[$this->key])) { $this->fcontents[$this->source[$this->key]] = $this->data; $this->key++; if($this->key >= $this->count) break; } /* Serializza l'array */ $this->data = serialize($this->fcontents);
la sostanziale differenza stà proprio qua:
[URL='http://it.php.net/count']Count() Conta gli elementi di un'array, in questo caso quello
contenente i percorsi dei files da comprimere.Il while esegue l'operazione di recupero dei files dal percorso specificato, e
li memorizza in $this->fcontents, forse vi sarà di più difficile comprensione,
questo: $this->fcontents[$this->source[$this->key]] = $this->data; che memorizza
in $this->fcontents['percorso_del_file'] il suo contenuto.Infine con [URL='http://it.php.net/serialize']serialize() Serializziamo l'array contenente
i files ed il loro percorso.
Poi crea l'archivio e vi mette dentro il contenuto compresso della serializzazione.Per quanto riguarda la decompressione dell'archivio, il codice è mutato qui:
/* E restituisce l'array */ $this->data = unserialize($this->data); /* Installa i files */ foreach($this->data AS $filename => $contents) { print $contents; if(!file_put_contents($filename, $contents)) $this->status = FALSE; }
In quanto, dopo che l'archivio è stato decompresso, bisogna deserializzarlo,
con la funzione [URL='http://it.php.net/unserialize']unserialize(), che in questo caso restituirà l'array
precedentemente creato.
Il foreach, in questo caso, serve a 'installare' i files, nel percorso salvato
durante la creazione dell'archivio, e in caso di un qualsiasi errore, non blocca
lo script ma restuirà FALSE.Questo metodo di compressione, come ho detto in precedenza, non è visualizzabile
con i programmi di gestione archivi, ma esiste la funzione [URL='http://it.php.net/gzencode']gzencode()
che permette di farlo.Esistono inoltre altri tipi di comrpessione GZ, Come quello DEFLATE:
Per creare archivi così, bisogna utilizzare la funzione [URL='http://it.php.net/gzdeflate']gzdeflate()
che ha come argomenti i dati da comprimere e il livello di compressione.
Per poi decomprimere questo tipo di archivio, utilizzaremo la funzione [URL='http://it.php.net/gzinflate']gzinflate()
che ha come argomenti, i dati e (opzionale) la lunghezza del file.Ora scriverò un paio di esempio per quanto riguarda l'utilizzo delle classi, sia
per i singoli che per gli archivi:include("./PaTeR_Class.php"); // Esempio per la creazione di un file singolo $singlegz = new gz_single(); $status = $singlegz->compress(".\File_di_origine.txt", "Nuovo_archivio_gz.txt.gz", /* Livello di compressione */); if(!$status) print "Errore durante la creazione dell'archivio gz"; // Esempio per la decompressione dell'archivio gz $singlegz = new gz_single(); $status = $singlegz->decompress("File_gz_da_decomprimere.gz", "Nuovo_file_decompresso.txt"); if(!$status) print "Errore durante la decompressione dell'archivio gz"; // Esempio creazione di un'archivio gz $archivegz = new gz_archive(".\Mio_archivio_gz.gz"); $files = array(".\file1.txt", ".\file2.exe", ".\file3.doc"); $status = $archivegz->compress($files, /* Livello di compressione */); if(!$status) print "Errore durante la creazione dell'archivio gz"; // Esempio di estrazione di un'archivio gz $archivegz = new gz_archive(".\Mio_archivio_gz.gz"); $status = $archivegz->decompress(); if(!$status) print "Errore durante la decompressione dell'archivio gz";
Con tutto ciò, ho pensato di poter essere stato utile a qualcuno... :stordita:
Perchè a volte può essere utile comprimere files o stringhe, specialmente quando
si lavora con file anche abbastanza grossi.
Ciauuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu...