Newsgroup: it.comp.www.php
Titolo: creazione file csv: problema se troppi record

Salve, vi spiego subito il mio problema: devo creare un file formato
csv dal risultato di una query.
Tutto funziona a dovere: il problema si presenta quando il file
contiene più di 40000 record circa, infatti restituisce una pagina
bianca, senza errori.
Non è problema di memoria perchè se io visualizzo i risultati a video
il browser inizia a estrarre i dati senza problemi, anche se ci mette
parecchio, visto che sono più di 40000 record, oppure mi dovrebbe
restituire un errore tipo "Fatal error: Allowed memory size...".
Non è un problema di sintassi della query perchè se io limito la query
a tot risultati il file viene creato.
Dov'è quindi il problema?
E soprattutto, qual è la soluzione?
Thanks

 il browser inizia a estrarre i dati senza problemi,
Potrebbe comunque essere un problema di memoria. Dipende da come hai
scritto il codice.
Potrebeb anche essere un problema di timeout.
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 E soprattutto, qual è la soluzione?
Non ne vedo altre se non intervenire su php.ini -> max_execution_time.
ciao, f.

Cujo ha scritto:

in realtà basta usare set_time_limit senza scomodare il php.ini che 
avrebbe effetto su tutto il sito

 Potrebeb anche essere un problema di timeout.
Inserito, ma non viene visualizzato nulla.
La memoria è stata aumentata, proprio perchè in altre occasioni mi
dava problemi di timeout o fatal error per la memoria.
Ci sono altri test che potrei fare per capire dov'è il problema?
Grazie intanto.

 Ci sono altri test che potrei fare per capire dov'è il problema?
Puoi bilitare il logging e controllare i log del web server dopo aver
richiamato la pagina.


 avrebbe effetto su tutto il sito
Non lo sapevo, grazie.
ciao, f.

Ho provato a scrivere il risultato su un file, ma ho lo stesso
problema: se è inferiore a circa 40000 record tutto ok, se è superiore
il file è vuoto!
Ho provato anche a memorizzare i risultati su 2 array, per verificare
se il problema dipendesse dalla mole di dati memorizzati in un singolo
array (a proposito, quant'è la grandezza max di un array?!?), ma
niente da fare, ottengo lo stesso problema!
Ho visto che il file con 35000 record circa pesa 6.5 Mb, quindi può
essere legato al fatto che il file di 40000 record sia troppo
grande?!??! Se si, come posso aggirare il problema??!!
Thanks

 problema??!!
Rivedendo la struttura del tuo software, probabilmente.
Bye.

 codice che usi per scrivere questi dati.
Il codice è molto semplice:
$sql_cerca = "SELECT * FROM ..."
$result_cerca = pg_query($sql_cerca)or die($sql_cerca);
if (pg_num_rows($result_cerca)>0) {
	$intestazioni = array("Denominazione", "Indirizzo", ...);
	while ($data_cerca = pg_fetch_array($result_cerca)) {
                $contenuto = "";
		$dati[] = array($data_cerca[denominazione],
addslashes($data_cerca[indirizzo]), ...;
	}
	$nomefilescaricato="Stampa.csv";
	// Ottiene la tabella in formato csv
	$contenuto=CreaContenuto($intestazioni,$dati);
	// Avvia e completa il download
	ScaricaDati($nomefilescaricato,$contenuto);
}
Le 2 funzioni servono per formattare il contenuto e per scaricarlo:
	function CreaContenuto($intestazioni,$dati){
		$contenuto="";
		/* 	Viene costruita una stringa che riporta separandoli	con virgole
i valori delle componenti dell'array della prima riga	*/
		foreach($intestazioni as $valore){
			$contenuto.="$valore;";
		}
		// Terminata la prima riga si inserisce una fine riga
		$contenuto.="\n";
		// Ad ogni ciclo si aggiunge una riga di dati
		foreach($dati as $riga) {
			// Ad ogni ciclo si aggiunge un dato in una riga
			foreach($riga as $valore){
				$contenuto.=str_replace(";"," ", $valore) . ";";
			}
			$contenuto.="\n";
		}
	return $contenuto;
	}
	function ScaricaDati($file,$contenuto){
	//    header("Content-type: application/vnd.ms-excel");
		header("Content-type: file");
		header("Content-Disposition: attachment; filename=$file");
		echo $contenuto;
	}
Come vedi il codice non fa niente di particolare, perciò non capisco
dov' è il problema!
Se fosse problema di timeout dovrebbe visualizzarmi qualche avviso o
messaggio di errore, invece niente!
Qualche aiuto su come/dove intervenire?!?
Thanks