Newsgroup: it.comp.www.php
Titolo: Leggere un file di testo di 30Mb.. eh si blocca -.-

ciao ragazzi!
io ho un problema con una procedura di backup database che ho scritto,
utilizzando le classe mysql_backup e una una funzione per comprimere
il file in formato gz:
function comprimi($input, $output, $delete){
    if(file_exists($input)){
        $myData=file_get_contents($input);
        if(!$myGz=gzopen($output, "w9")){
            return false;
        }
        if(!gzwrite($myGz, $myData)){
            return false;
        }
        gzclose($myGz);
        if($delete){
            unlink($input);
        }
        return true;
    }else{
        return false;
    }
}
il tutto funziona alla grande, mi creo il mio file txt, poi lo
comprimo con la funzione sopra, elimino l'originale, bom.
il problema si presenta nel momento in cui il file txt contenente il
database è superiore a 30Mb circa:
$myData=file_get_contents($input); mi si blocca tutte le volte.
ho provato con
$myData = '';
$handle = fopen($input, "r");
while (!feof($handle)) {
     $myData .= fgets($handle, 4096);
}
fclose($handle);
ma niente..
ora stò provando a spezzare in tranci da 20Mb e poi riunirli dentro al
variabile prima di buttarli in compressione..
voi che ne dite?
una roba del tipo
$myData='';
if(filesize($input) > 20000000){
   while(feof($handle)){
      $myData .= fread($handle, (20000000*$i));
   }
}else{
   $myData = fread($handle, filesize($input));
}
può funzionare?

 variabile prima di buttarli in compressione..
Utilizza un loop per la lettura utilizzando un buffer (es. 8Kb), poi,
all'interno dello stesso loop di lettura, invii i dati del buffer alla
compressione (tramite gzwrite).
In questo modo occuperai solamente la memoria del buffer e poco piu'.
-- 
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/

}
Prova cosi':
function comprimi($input, $output, $delete)
{
	if (!file_exists($input))
		return false;
	$fp = fopen($input, 'r');
	$gp = gzopen($output, 'w9');
	while(!feof($fp))
	{
		$chunk = fread($fp, 16384);
		if (gzwrite($gp, $chunk))
			continue;
		fclose($fp);
		@gzclose($gp);
		@unlink($output);
		return false;
	}
	gzclose($gp);
	fclose($fp);
	if ($delete) @unlink($input);
	return true;
}
Leonardo che non garantisce, come al solito
--
The stars have not dealt me the worst they could do:
My pleasures are plenty - my troubles are two.
But oh!, my two troubles, they reave me of rest:

grazie ragazzi,
non mi era venuto in mente di mandare direttamente in gwrite il
buffer, io lo immaganizzavo nella variabile -.-
ora funziona alla perfezione, test fatto con file da 80Mb ^^
posto le funzioni finali, se qualcuno dovesse avere il mio stesso
problema:
function comprimi($input, $output, $delete){
	ini_set('max_execution_time', 1800);
	if(file_exists($input)){
		if(!$fileHandler = fopen($input, "r")){
			return false;
		}
		if(!$myGz=gzopen($output, "w9")){
			return false;
		}
		while(!feof($fileHandler)){
			$myData = fread($fileHandler, 5120);
			if(!gzwrite($myGz, $myData)){
				die('Errore nella scrittura in gz');
			}
		}
		fclose($fileHandler);
		gzclose($myGz);
		if($delete){
			unlink($input);
		}
		return true;
	}else{
		return false;
	}
}
function decomprimi($input, $output, $delete){
	ini_set('max_execution_time', 1800);
	if(file_exists($input)){
		if(!$myOutput=fopen($output, 'w')){
			return false;
		}
		$myGz=gzopen($input, "r");
		while(!gzeof($myGz)){
			$fileData=gzread($myGz, 5120);
			if(!fwrite($myOutput, $fileData)){
				die('errore nella scrittura del file decompresso');
			}
		}
		fclose($myOutput);
