Newsgroup: it.comp.www.php
Titolo: memory_limit e file di grandi dimensioni

Ho un problema nel stampare a video un file SQL di circa 13Mb caricato
tramite uno script AJAX (jquery).
Il messaggio di errore è questo: 
"Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to
allocate 54615853 bytes) in /usr/local/psa/home/vhosts/..."
 
Se il file invece rimane sotto i 13Mb non ho particolari problemi.
 
Ho provato con ini_set('memory_limit','128M'), ma il risultato non
cambia anche con valori inferiori.
 
E' possibile fare qualcosa?
 
Tnx
 
-- 
http://www.maxori.it
 
L'Arte è la capacità di fare cose di nessun valore
e di riuscire a venderle
F. Zappa

Il problema era la conversione in UTF-8 operata sul print()
Usando header('Content-Type: text/html; charset=utf-8');
Ho risolto.
 
Saluti


E' possibile fare qualcosa?
 
Certo. Non usare print(): usa readfile(), che non occupa memoria. Però per essere
un po' affidabile dovrei vedere che codice usi adesso.
 
	while (ob_get_level()) {
		ob_end_clean();
	}
	Header('HTTP/1.0 200 OK'); 
 	Header('Content-Type: text/plain;charset=utf8');
	Header('Cache-Control: public, must-revalidate, max-age=0');
	Header('Pragma: no-cache'); 
  	Header('Content-Length:' . filesize('file.sql'));
	Header('Content-Disposition: inline; filename="nomefile.sql"');
	Header('Content-Transfer-Encoding: binary');
        Header('Connection: close');  
	readfile('file.sql');
 
Leonardo un po' a caso
 
-- 
 
Now suppose -just suppose- I could show you a way to
manufacture a wall that would do the same job... but
was only one inch thick.

 
 
Il problema è che lo deve "stampare a video", non far scaricare (e per quello,
senza la readfile, bastava linkare il file finale all'utente, sempre si
trovasse in una cartella accessibile al WS).
 
La vera domanda sarebbe perché mai bisogna stampare a video un file di 13Mb,
che non posso immaginarlo. Che ci deve fare un utente con quella roba?
Immagino poi neppure con syntax highlight (in HTML o JS), che sennò
schianterebbe tutto. Boh?
 
Ciao!

che non posso immaginarlo.
 
Io ho interpretato con "Lo stampo a video così poi me lo salvo": perché tenerlo
a video SENZA salvarlo vuol dire che uno se lo deve leggere; e poche persone si
metterebbero all'anima di compulsare un file di 13 Mb.
 
A quel punto, essendo un probabile problema XY, ho fornito la risposta a X :-)
 
Nei border case in cui uno deve leggere "qualcosa" e usarlo per decidere se sia
o no il caso di salvare, uno manda a video il solo qualcosa e unisce un link ad
uno script che usa readfile() (o al file SQL se, come giustamente osservi, è in
una zona accessibile a quella istanza del webserver).
 
Leonardo



Rispondo con qualche dettaglio in più.
Il tutto è un sistema di backup incrementale fra due server differenti.
Una parte è gestita in automatico da un crontab che aggiorna nottetempo
i due db (il secondo Db è un backup del primo, nel caso il server
principale si blocchi).
 
E poi c'è una parte "manuale" (richiestami espressamente) che permette
di controllare i files in modo visuale, e, nel caso di probplemi, che
possa consentire un aggiornamento manuale o, in casi estremi, di
ripartire da zero e reinstallare tutti i backups in ordine temporale. 
 
Il problema non si pone negli aggiornamenti giornalieri, che sono poche
centinaia di righe di dati, ma si è evidenziato nella fase iniziale
della prima esportazione, perciò con i primi backups piuttosto corposi
perchè contenenti tutti i dati.
 
Cmq grazie a tutti per gli interventi, sempre preziosi e costruttivi.
 
 
Max-- 



Comunque ci sono tecniche apposta per fare backup di DB: la cosa più comune
(perché rapida da metter su) è fare backup incrementale dei dump, così
come di tutto il resto.
Se hai bisogno di un secondo DB (anche se in pratica non è un "backup")
perché se succede qualcosa al primo puoi fare switch al volo, c'è la
MySQL replication (se non usi MySQL ogni DBMS ha il suo modo) - che gestisce
questo specifico caso, senza dover far tu nulla in PHP.
 
Ciao!

 Usando header('Content-Type: text/html; charset=utf-8'); Ho risolto.
 
Il problema ti ricapiterà quando avrai un file da 15, o da 20 MB.
 
Essendo scaricato via AJAX, fai come dice Leonardo e usa readfile. È anche 
più veloce e meno pesante sul server.
 
A quel punto il problema sarà del client, ma se il cliente ha chiesto 
così, sono fatti suoi. :)
 
Bye.

 Ciao!
 
Ignoravo questa cosa, anche se in fondo a qualche cassetto del cervello
c'era qualcosa che tintinnava.
Grazie, provo a vedere se ho la possibilità di intervenire come Admin
sui due DB.
 
Grazie ancora
Max
