Newsgroup: it.lavoro.professioni.webmaster
Titolo: Php e la memoria in uso che aumenta quando dovrebbe diminuire

Ho appena scoperto che se con una variabile di testo lunga 400K eseguo 
questa istruzione:
$a = substr($a,300000);   //Metti in $a i caratteri di $a
                           //dalla posizione 300000 in poi
La memoria in uso alla pagina php non solo non diminuire di 300K (benchï¿œ 
il risultato sia una variabile di 300K piï¿œ corta) ma aumenta di 80K!
Che diavoleria ï¿œ questa?

 Che diavoleria è questa?
Si chiama garbage collection. La memoria non viene liberata subito, ma 
quando "passa" il garbage collector.
Bye.


garbage collecting..
Se php tutte le volte che cambia una variabile dovesse andare a cambiarla 
effettivamente sarebbe lentissimo.
Invece il suo comportamento ï¿œ:
mi dimentico della vecchia locazione di $a e ne creo una nuova
Ogni tanto pulisco dalla memoria le variabili in disuso
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
www.robyt.eu

 quando "passa" il garbage collector.
Sbagliato.
La variabile viene passata ad una funzione (non l'ho specificato, metà 
colpa mia che non l'ho detto e metà colpa tua che non c'hai pensato ;), 
premesso che la sua doppia esistenza globale e locale non comporta in 
php la creazione di due variabili uguali in due aree di memoria, nella 
funzione il suo contenuto deve comunque essere preservato per lo scope 
globale quindi la sua cancellazione nello scope locale non comporta 
rilascio di memoria.
Invece nel momento in cui si va a modificare la variabile nella 
funzione, php non può più puntare la stessa variabile in memoria sia per 
lo scope globale che locale visto che le variabili sono diventare 
diverse, quindi deve creare una nuova variabile per un totale di due, 
una dello scope globale e una dello scope locale.
Non so se mi sono spiegato, spero di sì.
Per la cronaca fare unset($qualcosa) o anche $qualcosa = null causa 
rilascio di memoria indicato dalla funzione memory_get_usage().

 garbage collecting..
Sbagliato.
La variabile viene passata ad una funzione (non l'ho specificato, metï¿œ 
colpa mia che non l'ho detto e metï¿œ colpa tua che non c'hai pensato ;), 
premesso che la sua doppia esistenza globale e locale non comporta in 
php la creazione di due variabili uguali in due aree di memoria, nella 
funzione il suo contenuto deve comunque essere preservato per lo scope 
globale quindi la sua cancellazione nello scope locale non comporta 
rilascio di memoria.
Invece nel momento in cui si va a modificare la variabile nella 
funzione, php non puï¿œ piï¿œ puntare la stessa variabile in memoria sia per 
lo scope globale che locale visto che le variabili sono diventare 
diverse, quindi deve creare una nuova variabile per un totale di due, 
una dello scope globale e una dello scope locale.
Non so se mi sono spiegato, spero di sï¿œ.


 rilascio di memoria indicato dalla funzione memory_get_usage().
Ora non so dirti se memory_get_usage() tenga conto delle variabili "in 
garbage collection", oppure forzi di suo un giri di garbage collector.
Bye.

 garbage collection", oppure forzi di suo un giri di garbage collector.
Mi sono posto la stessa domanda ma non ho cercato una risposta perché ho 
risolto in altro modo (= controllando nel ciclo principale l'uso di 
memoria e quando questo supera i 7M terminare alle bell'e meglio quello 
che sta facendo (= parsing di codice html)).

 Dubito nella maniera più totale.
Beh. Hai ragione. Non lo sapevo e mi sono informato. PHP implementa di 
suo il copy-on-write. :)
Bye.