Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [OOP/ISTANZE/CLASSI] ma le istanze devono essere chiuse?

    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

  2. #2
    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); 

  3. #3
    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

  4. #4
    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

  5. #5
    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
    ecco perchè hanno creato la garbage collection ... ed ecco che non si spiega perchè in PHP stia troppo spesso in letargo
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    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
    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...).

    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.

  7. #7
    Originariamente inviato da OhMyGod
    PHP non ha una garbage collection
    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
    , 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...).
    ma che dici ? a cosa servirebbe lo scope se tutto fosse statico e sempre allocato ?




    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.
    e cosa lo uso a fare un linguaggio di scripting ?




    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.
    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.

    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 ...




    Originariamente inviato da OhMyGod
    quello che va in letargo non è PHP, ma i programmatori che non potenziano il codice.
    ah certo, il problema dei programmatori php è che non usano unset ovunque ... altrochè
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    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 ^^)

  9. #9
    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.

  10. #10
    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.
    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 ?

    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
    Zeev 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.
    giusto per dire che l'engine ha una sua garbage ... e gestisce la memoria in auomatico
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.