Newsgroup: it.comp.www.php
Titolo: Decomprimere file zip o caricare cartella tramite http

Ciao,
conoscete qualche script php che consenta di decomprimere un file
zip?
Inoltre, mi servirebbe uno script che permetta di caricare su un server 
remoto
una intera cartella con tutti i suoi file e sottocartelle.
Il server php è la versione 5.3.2 con attivato Phar


Ho notato che il server supporta anche Bzip2 ver 1.0.3
Quindi sarebbe possibile anche decomprimere file .bz2?

 una intera cartella con tutti i suoi file e sottocartelle.
Non è questione di PHP ma di HTTP, HTTP non lo permette.


Come si può risolvere 'sto problema?
Forse con componenti Flash, Silverlight o simili?
Oppure, con script php che fanno l'upload di un file
alla volta, ma in tal caso le prestazioni sarebbero
inferiori?

 Non è questione di PHP ma di HTTP, HTTP non lo permette.
A dire il vero non ha specificato il protocollo, si potrebbe fare con
FTP o con HTTP usando WebDAV (dovrebbe avere i comandi PUT e MKDIR).
	Y.


Interessante, ma usando un normale programma ftp per il trasferimento
dei file si hanno i soliti problemi di lentezza.
Insomma, cerco un modo più veloce di trasferire grosse quantità di file
contenuti in una directory verso un server remoto che supporta php.
Le possibilità sono due, o comprimo la directory in un file zip o tar,
la trasferisco sul server tramite ftp (in questo caso il trasferimento
sarebbe più veloce) e tramite uno script php estraggo i file 
direttamente sul server; oppure dovrei poter trasferire in modo
efficiente i file tramite uno script php o un applicazione Flash o Java.

 dei file si hanno i soliti problemi di lentezza.
Guarda che è vero il contrario.
Il protocolloo FTP è pensato proprio per trasferire file ed è quello con 
cui ottieni i risultati migliori. Se trasferisci i tuoi files con php, 
http & C. vai certamente più lento.
Se il trasferimento ftp ti pare tanto lento forse devi configurare 
meglio il tuo client ftp.
ciao
Mauro

 conoscete qualche script php che consenta di decomprimere un file zip?
<?php
    $zip = new ZipArchive;
    $res = $zip->open('file.zip');
    if ($res === TRUE) {
       $zip->extractTo('.');
       $zip->close();
       echo 'ok';
   } else {
       echo 'failed';
   }
?>
lo uso per fare migrazioni di grosse quantità di files tra macchine 
remote 
Ad es: una installazione di joomla con un po' estensioni arriva 
tranquillamente a superare i 5K files (ma anche 10K ), copiarli uno ad 
uno via ftp diventa insostenibile, quindi unico zip più un file unzip.php 
con il codice sopra, poi visito la pagina 
http://dominio.com/unzip.php
 , 
poi cancello unzip.php via ftp. si rispamiano diverse ore.


Forse non l'ho configurato bene, ma ho appena fatto una prova
a trasferire 200 MB di dati contenuti in una cartella (i dati
sono costituiti da molti file e sottocartelle) tramite
ftp. Il tempo necessario è davvero eccessivo.
Un'altra prova l'ho effettuata trasferendo, sempre tramite ftp,
gli stessi dati, ma compressi in un unico file tar.
In tal caso il tempo di trasferimento è stato più breve (accettabile).
Se puoi dimmi quali impostazioni generiche dovrei fare del client
ftp per velocizzare il trasferimento di cartelle e file multipli.


Mi confermi che tramite ftp diventa appunto insostenibile trasferire
grosse quantità di file.
Ti ringrazio per lo script.
ZipArchive si rifà a quale classe?

 ftp per velocizzare il trasferimento di cartelle e file multipli.
Non so quali client usi ... io sul mio filezilla ho abilitato la 
funzione "usa connessioni multiple" in modo che trasferisca piu' di un 
file alla volta e le prestazioni sono discrete. Poi ci sono tanti altri 
parametri che si possono modificare ma sinceramente non li conosco bene, 
mi sono sempre trovato bene con quelli di default.
Ma il mio discorso principale era che ftp è il miglior protocollo per 
trasferire file. Qualsiasi altro protocollo tu usi introdurrai un 
overhead che ti penalizzerà le prestazioni, quindi il tuo problema di 
lentezza non lo risolvi usando http (ammesso che si possa fare).
ciao
Mauro

 mi sono sempre trovato bene con quelli di default.
Ti ringrazio per il suggerimento circa filezilla.
Farò delle prove per capire come va questo metodo.

 grosse quantità di file.
Scusa se intervengo di nuovo. Il problema *non* è il protocollo ftp, il 
problema sono le grosse quantità di file.
Io su un sito di drupal per esempio ho
25.341.952 byte in 2198 file e 334 cartelle
comunque decida di trasferire questa roba ci metto una vita. Mettiamo 
che ci voglia mezzo secondo per aprire la connessione, accordarsi per 
l'invio, confermare la ricezione e chiuderla ... ti servono 1100 secondi 
per farlo ... senza contare il tempo di trasferimento dei dati.
Se comprimo la cartella ottengo UN file da 9.080.000 byte e solo questo 
mi fa risparmiare 1099 secondi (in base alla mia ipotesi di perdere 
mezzo secondo a file per il trasferimento) dovendo trasferire un solo 
file anzichè 2198, se poi conti che devi trasferire 9 mega al posto di 
25 vedi quanto risparmi in tempo e banda.
Ma è la compressione della cartella che ti fa guadagnare spazio, non il 
protocollo utilizzato.
ciao
Mauro

 per farlo ... senza contare il tempo di trasferimento dei dati.
[cut]
Io mi riferisco proprio a questi problemi.
Cioè: se ipotizziamo di inviare un unico file
(indipendentemente dal fatto che sia compresso o meno)
da 200 MB e la stessa quantità di dati (200 MB)
in forma di cartelle, file e sottocartelle.
Bene, se il protocollo ftp necessita di vari messaggi
di scambio fra il client ed il server per ogni file
che invia, di fatto il trasferimento dell'unico file
sarà più veloce, perché i suddetti messaggi di controllo
saranno inviati solo all'inizio ed alla fine della sessione
di invio.
Nel caso dei file multipli avrò svariati messaggi di controllo,
ad es. se i file sono 1000 a avro n*1000 messaggi scambiati fra
il client ed il server. Ciò inevitabilmente crea rallentamenti.
Detto questo, arrivo alla ipotesi che il protocollo influisce
sul tempo di trasferimento.

 http & C. vai certamente più lento.
Fonte?
A parte un eventuale overhead iniziale qual è la differenza nel caricare 
un file poniamo di 50Mb con FTP o HTTP? Intendo dati veri, non 
inventati.

 FTP o con HTTP usando WebDAV (dovrebbe avere i comandi PUT
PUT ce l'ha anche HTTP, il punto è che l'elemento <input> di tipo "file" 
accetta un file e non una intera gerarchia.

 inferiori?
Script che fanno l'upload… ma tu vuoi uno script che giri _sul client_ 
per inviare una directory ricorsivamente?

 inventati.
Uh .... dovrei rispolverare i libri di informatica dell'università ... 
comunque tanto per dirne una con http hai una intestazione che comprende 
tra le altre cose la data di ultima modifica del file, il character 
encoding, il server name, la versione e tante altre cose.
E questo lo deve fare per ogni pacchetto in cui spezzetta il file che 
vuole inviare.
Nei files di piccole dimensioni lo spazio occupato dagli header puo' 
essere quasi uguale allo spazio occupato dal contenuto del messaggio stesso.
Non ho "dati veri" da portare, solo ricordi di studi. Ma il nome stesso 
del protocollo dovrebbe darti una idea.
Http è stato pensato e ottimizzato per trasferire ipertesti
Ftp è stato pensato e ottimizzato per trasferire files.
ciao
Mauro

 sul tempo di trasferimento.
Eh grazie, quello che conta è quanto il dialogo di controllo influisca 
sul tempo totale, se trasferisci 1000 file da 1Gb l'uno vedi bene che è 
trascurabile.
Inoltre non so il canale dati come funziona in FTP, se cioè viene aperta 
una socket TCP ad ogni trasferimento o meno, anche questo (oltre al 
dialogo di controllo di FTP, cioè del livello applicazione) potrebbe 
creare ritardo.

 Ma il nome stesso del protocollo dovrebbe darti una idea.
Ma questa non è una motivazione valida.

trasferire file.
Oddio, ci sarebbe qualcosa da dire su rsync :-D
Leonardo
-- 
The cock doth craw, the day doth daw,
the channerin' worm doth chide:
gin we be mist oot o' oor place,
a sair pain we maun bide.

inventati.
Dipende da che tipo di trasferimento HTTP si utilizza.
Con il metodo PUT, o usando RFC-1867 e Content-Transfer-Encoding: binary,
la differenza non c'e'. Pero' mi e' capitato di vedere un upload avvenire
in base64, non ricordo assolutamente il perche'.
D'altro canto, FTP e' un protocollo abbastanza rognoso quando ci si mette
- PASV, EPASV, PORT eccetera.
Diciamo che in ogni caso ragionevole, la differenza di prestazioni e' una
cosa minima, ma fra i due preferirei HTTP perche' piu' semplice a livello
architetturale.


 per inviare una directory ricorsivamente?
Sul server, ma forse non si può fare...

 Sul server, ma forse non si può fare...
A fare si può fare tutto. Ricapitolando: tu vuoi che su un computer, che 
chiami "server", giri uno script in PHP che abbia l'effetto di 
percorrere iterativamente una cartella, residente su "server", e 
caricarla su di una ulteriore macchina?


No, deve caricare una cartella da un client verso un server,
ma lo script per fare ciò dovrebbe girare su un client.
Probabilmente è necessario farlo con Javascript o un componente
Flash o Java che si interfaccia con PHP.


Voglio dire: se lo script gira su un server non si può fare?

 Voglio dire: se lo script gira su un server non si può fare?
Ad essere sincero ho perso del tutto il filo della discussione, puoi 
riassumere il problema in maniera chiara e in un unico messaggio?