se con $NomeVariabile = new NomeClasse(); creo un'istanza ...devo anche chiuderla prima o poi? e come? con unset($NomeVariabile); ?![]()
se con $NomeVariabile = new NomeClasse(); creo un'istanza ...devo anche chiuderla prima o poi? e come? con unset($NomeVariabile); ?![]()
Farmacia di Jarno - le mie pillole: Cookie [#780810], Dom4Php4 [#1123236], Fade [#1139489], getCssProperty [#1152911]
Inchinatevi difronte al Prof! Nacchio!
A me pare che l'uomo vada avanti con la retromarcia
con unset($NomeVariabile) stai distruggendo la variabile $NomeVariabile che istanzia la tua classe, ma non ripulisce l'eventuale memoria allocata internamente dalla classe. è buona norma che ogni classe abbia un metodo distruttore che si occupi di eliminare (mediante la funzione unset, o altre funzioni in base alla tipologia di dato che si vuole cancellare come dati in database, files di swap ecc.) tutte le variabili usate internamente alla classe stessa, in modo da poter ripulire la memoria durante il de-istanziamento della classe con due semplici istruzioni:
Codice PHP:
$NomeVariabile = new NomeClasse(); // istanziamento
...
$NomeVariabile.destroy(); // de-istanziamento richiamando il metodo destroy() definito nella classe
unset($NomeVariabile);
Originariamente inviato da OhMyGod
con unset($NomeVariabile) stai distruggendo la variabile $NomeVariabile che istanzia la tua classe, ma non ripulisce l'eventuale memoria allocata internamente dalla classe. è buona norma che ogni classe abbia un metodo distruttore che si occupi di eliminare (mediante la funzione unset, o altre funzioni in base alla tipologia di dato che si vuole cancellare come dati in database, files di swap ecc.) tutte le variabili usate internamente alla classe stessa, in modo da poter ripulire la memoria durante il de-istanziamento della classe con due semplici istruzioni:
Codice PHP:
$NomeVariabile = new NomeClasse(); // istanziamento
...
$NomeVariabile.destroy(); // de-istanziamento richiamando il metodo destroy() definito nella classe
unset($NomeVariabile);
al posto del . ci vuole la ->
Codice PHP:
$NomeVariabile->destroy();
www.gext.it
figo![]()
difatti ieri notte mi è comparso un problemino con l'istanziamento di una classe: mi dava esaurimento della RAM (12MB) quando secondo i miei calcoli ne stavo usando (5MB)
...non avevo distrutto una variabile usata precedentemente...![]()
grazie 1000![]()
Farmacia di Jarno - le mie pillole: Cookie [#780810], Dom4Php4 [#1123236], Fade [#1139489], getCssProperty [#1152911]
Inchinatevi difronte al Prof! Nacchio!
A me pare che l'uomo vada avanti con la retromarcia
ecco perchè hanno creato la garbage collection ... ed ecco che non si spiega perchè in PHP stia troppo spesso in letargoOriginariamente inviato da OhMyGod
con unset($NomeVariabile) stai distruggendo la variabile $NomeVariabile che istanzia la tua classe, ma non ripulisce l'eventuale memoria allocata internamente dalla classe. è buona norma che ogni classe abbia un metodo distruttore che si occupi di eliminare (mediante la funzione unset, o altre funzioni in base alla tipologia di dato che si vuole cancellare come dati in database, files di swap ecc.) tutte le variabili usate internamente alla classe stessa, in modo da poter ripulire la memoria durante il de-istanziamento della classe
PHP non ha una garbage collection, ma sinceramente non mi pare un problema... basta mantenere un po' di buon senso quando si scrive il codice. anzi ti dirò di più: preferisco nettamente un linguaggio senza garbage collection! fornisce una gestione della memoria molto migliore e permette potenziamenti avanzati (oltre ad insegnarti come si programma.... distruggere le variabili è una cosa che dovrebbe essere fatta sempre, non è un'optional...).Originariamente inviato da andr3a
ecco perchè hanno creato la garbage collection ... ed ecco che non si spiega perchè in PHP stia troppo spesso in letargo
prendiamo come esempio un blocco di codice che costruisce un array, magari di grandi dimensioni, che viene usato solo nelle 2 o 3 linee di codice appena successive alla creazione dell'array... dopo queste 2 o 3 linee di codice l'array non serve più e può (o meglio, deve) essere de-allocato manualmente. la garbage collection invece lo manterrebbe inutilmente in memoria per tutte le linee di codice successive alle 2 o 3 che effettivametne lo usano, all'interno del blocco in esame. e questo è un errore enorme.
quello che va in letargo non è PHP, ma i programmatori che non potenziano il codice.
che dici ? ... fai qualche test con APD e vedi come la memoria va su e già da sola senza implementare alcun unset.Originariamente inviato da OhMyGod
PHP non ha una garbage collection
ma che dici ? a cosa servirebbe lo scope se tutto fosse statico e sempre allocato ?Originariamente inviato da OhMyGod
, ma sinceramente non mi pare un problema... basta mantenere un po' di buon senso quando si scrive il codice. anzi ti dirò di più: preferisco nettamente un linguaggio senza garbage collection! fornisce una gestione della memoria molto migliore e permette potenziamenti avanzati (oltre ad insegnarti come si programma.... distruggere le variabili è una cosa che dovrebbe essere fatta sempre, non è un'optional...).
e cosa lo uso a fare un linguaggio di scripting ?Originariamente inviato da OhMyGod
prendiamo come esempio un blocco di codice che costruisce un array, magari di grandi dimensioni, che viene usato solo nelle 2 o 3 linee di codice appena successive alla creazione dell'array... dopo queste 2 o 3 linee di codice l'array non serve più e può (o meglio, deve) essere de-allocato manualmente.
se mi parli di scope posso darti ragione ... se mi parli fuori dallo scope posso dirti di provare APD e valutare con i tuoi occhi il comportamento della memoria a scope terminato.Originariamente inviato da OhMyGod
la garbage collection invece lo manterrebbe inutilmente in memoria per tutte le linee di codice successive alle 2 o 3 che effettivametne lo usano, all'interno del blocco in esame. e questo è un errore enorme.
Inoltre unset non libera veramente la memoria bensì dice alla garbage "fantasma" di liberare quanto prima quella memoria.
Stando a quanto scrivi per ogni codice di PHP ci sarebbero più unset che altro ...
ah certo, il problema dei programmatori php è che non usano unset ovunque ... altrochèOriginariamente inviato da OhMyGod
quello che va in letargo non è PHP, ma i programmatori che non potenziano il codice.![]()
php ha ovviamente un garbage collector altrimenti quando esci da una funzione, da un metodo o da qualche altra sub routine le variabili allocate in memoria lo rimarrebberò causando un'esaurimento completo della memoria senza bisogno di fare chissa che cosa
prova a pensare per esempio al caricamento di file in memoria, poi alla loro elaborazione e all'uscita ... io se lo faccio in metodi/funzioni non mi preoccupo di unsettare la variabile per il semplice motivo che lo fa php per me, tanto che il mio software usa pochissima memoria (senza apc/eacclerator siamo sotto gli 800kb mentre con uno di quei due siamo sotto i 400 ^^)
VM su SSD da 5$! https://www.digitalocean.com/?refcode=f6925c7f0ddb
dove avete trovato le informazioni sulla garbage collection di PHP? facendo una ricerca un po' veloce ho trovato soltanto informazioni sulla garbage collection delle sessioni, e alcuni blog e forum che parlavano della garbage collection condendola con "penso", "correggetemi se sbaglio" e cose simili, quindi tutto molto incerto. ma niente di ufficiale. fatemi sapere.
ma come, hai fatto un discorso tipo "l'unico che potenzia veramente il codice php" e non sai che ogni linguaggio di scripting è stranoto nonchè scontato che abbia un gestore automatizzato della memoria ?Originariamente inviato da OhMyGod
dove avete trovato le informazioni sulla garbage collection di PHP? facendo una ricerca un po' veloce ho trovato soltanto informazioni sulla garbage collection delle sessioni, e alcuni blog e forum che parlavano della garbage collection condendola con "penso", "correggetemi se sbaglio" e cose simili, quindi tutto molto incerto. ma niente di ufficiale. fatemi sapere.
in questo specifico caso il fatto che faccia unset dell'istanza, eliminando il riferimento e non esistendo più quindi alcun modo di accedere alle informazioni in esse precedentemente contenute, e non si liberi la memoria è proprio un problema del garbage collector "pigro".
Il distruttore di PHP 5 non è che l'hanno creato perchè tutti li dentro devono scrivere unset di ogni variabile dell'istanza ... questo potevano automatizzarlo in core tranquillamente ... serve ad assicurarsi che prima che questa venga eliminata le operazioni li presenti vengano compiute.
Se tu per maggiore sicurezza vuoi tentare di forzare il garbage sfruttando unset sei libero di farlo ma non pensare di aver creato chissà quale codice migliore scrivendo unset da tutte le parti ... anzi, hai solo aumentato il tempo di esecuzione, seppur di pochissimo, grazie al sovraccarico dato dalle numerose chiamate di funzione, che sia print o unset ... cambia poco (e print lo sconsigliano proprio perchè funzione e quindi più lento di echo .. per dirne una .. ed addirittura si dice che unset in PHP4 non serva assolutamente a niente .. per dirne un'altra)
Per concludere, il modo più rapido, veloce ed indolore per deallocare le informazioni è ricreare a valore vuoto la stessa variabile, senza sprecare inutili chiamate di funzione o se proprio necessario dopo aver usato unset.
$array_kilometrico = array(mille mila ....);
// non serve più
$array_kilometrico = array();
meglio di unset($array_kilometrico)
ed il bug delle sessioni era proprio basato sul fatto che la pigrizia del garbage, riferito alle sezioni, non era in grado di svuotarle veramente del tutto alla chiamata unset($_SESSION) ... mentre $_SESSION = array(); assicurava una migliore efficienza sulla pulizia.
Comunque sia, questo è un post del 2002:
http://www.zend.com/lists/php-dev/200205/msg00622.html
giusto per dire che l'engine ha una sua garbage ... e gestisce la memoria in auomaticoZeev Suraski
If you're adding elements to a hash you created using array_init(), and
you're using the standard macros (which apparently you are) - then yes, the
engine will take care of garbage collection for you.
![]()