Newsgroup: it.comp.www.php
Titolo: [LUNGO]problema download file grosse dimensioni

Ciao a tutti volevo esporvi il mio problema con il download di un file.
ho una classe che mi crea un file .zip a partire da 1..3 file jpg.
Il problema è che se i files sono troppo grandi al posto di aprirmi la
finestra di download ho l'errore 'Impossibile visualizzare la pagina'.
Il file lo creo 'al volo' utilizzando la suddetta classe e inviandolo
poi
via HTTP utilizzando gli header seguenti:
header("Content-type: application/octet-stream");
header("Content-disposition:
attachment;filename=".$nomeFileToDownload.".zip");
seguiti da
echo $zipFile->file(); // metodo della classe che mi crea l'output.
La cosa strana è che in locale tutto funziona benissimo:mi fa fare il
download del file e quest'ultimo contiene esattamente ciò che deve
contenere ovvero alcuno file della dimensione originaria.
Controllando nel php.ini sia locale che remoto ho notato che ho questi
parametri, che forse possono essere utili:
max_execution_time = 30
max_input_time = 60
post_max_size = 8M
memory_limit = 8M
Il mio dubbio è che l'errore sia nel fatto che non ne vuole sapere,sul
server remoto, di leggere files di dimensioni notevoli(>1MB) e mi da
subito l'errore.
Anche se provo a creare il file sul filesystem e poi leggerlo e
spedirlo con gli header mi da lo stesso errore('Impossibile
visualizzare la pagina').
Preciso che:
display_error = on
error_reporting = E_All & ~E_NOTICE & ~E_STRICT
e nella pagina incriminata ho solo l'errore sopraesposto.
configurazioni:
Locale : Apache/1.3.31 (Win32) PHP/5.0.1
Remoto : Apache/2.0.50 (Fedora) PHP/4.3.8
Potrebbe essere un problema di timeout da qualche parte, magari anche
del webserver?
Qualcuno mi sa dare una spiegazione?
Servono altre informazioni?
Grazie!
Daniele

 echo $zipFile->file(); // metodo della classe che mi crea l'output.
Invece di fare echo, prova a modificare la classe ed ad inviare
l'output appena e' disponibile in modo utilizzare memoria inutilmente.
Prova anche ad usare 
http://www.php.net/memory_get_usage
 per capire
quanta memoria stai utilizzando per eseguire le elaborazioni e varifica
sul server se la memoria disponibile e' veramente 8M (es. con print
(ini_get ('memory_limit'));)
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

(es. con print(ini_get ('memory_limit'));)
Effettivamente erano 8MB mentre in locale non è impostato il limite
della memoria.Posti 32MB sul server remoto tutto funziona...grazie!
Daniele

 no?Correggimi se ho detto delle castronerie!
Guarda il codice di esempio di 
http://www.php.net/memory_get_usage
 
Ad ogni assegnazione la memoria utilizzata cambia.


Ad ogni assegnazione la memoria utilizzata cambia.
D'accordo ma il mio dubbio rimane e provo, utilizzando il caso concreto
che mi ha posto davanti al problema, a spiegarmi meglio.
La mia classe ha un metodo (add_file(), nn penso serva spiegare la sua
funzione;) )che mette in un array della classe il contenuto del file da
zippare, passato come parametro e da me letto con file_get_contents(),
e in un altro array delle stringhe di controllo.
Col metodo file() esegue l'implode di questi due array e li concatena,
poi aggiunge(concatena) dei caratteri di controllo alla fine del
file;terminato ciò ritorna il tutto che viene poi ad essere il
contenuto del file .zip
Detto ciò...lo spazio di memoria occupato dai due array cresce man
mano che aggiungo i file(giusto?) ma il problema, secondo me, nasceva
nel momento in cui leggevo il contenuto dei files:se commentavo la riga
di lettura del file lasciando il metodo add_file() il resto andava
bene(ovviamente alla fine il file zip era vuoto),
mentre se leggevo e commentavo il metodo add_file() l'errore si
ripresentava;alla luce di ciò....se il contenuto è quello tale
rimane...ma io glielo devo far leggere tutto!
Per quello supponevo ci fossero problemi con qualche limite male
impostato sul server.
Comunque sia....sai dove trovare maggiori specifiche sulla gestione
della memoria et similia da parte di php?
Intanto grazie molte x il tuo prezioso aiuto...e nn solo in questo
caso(a tua insaputa mi hai aiutato milioni di volte postando qui ;) )!
Daniele

 della memoria et similia da parte di php?
IMHO la cosa si puo' riassumere semplicemente. Ogni volta che assegna
ad una variabile un valore/contenuto questo risiede in memoria fin
tanto che non viene rilasciato (es tramite unset), sostituito (per
mezzo di una altra assegnazione) oppure finisce lo script.
Nel tuo caso il fatto di caricare in memoria tutto il contenuto di
tutti i file prima di effettuare la compressione IMHO introduce un
overhead nell'utilizzo della memoria non da poco. Prova a modificare la
tua classe in modo da leggere il contenuto del file solo quando serve e
liberare la memoria della variabile che lo contiene appena non serve
piu'.
-- 
I am what I am, I do what I can


appena non serve piu'.
Proverò a fare come dici, spremerò le meningi...;)
Nel frattempo grazie x i suggerimenti!!!
Daniele