allocazione memoria

ave

ho due piccoli dubbi.

uno script crea e inizializza delle variabili, sia dentro a delle funzioni che non. non viene usata unset(). esempio:

<?php
   $test1="uno";
   function test() {
      $test2="due";
   }
?>

ad una successiva inclusione dello stesso script, il php utilizzerà le stesse locazioni di memoria per le variabili dello script, oppure ne creerà di nuove, allocando altra memoria, per poi usarne solo una parte?

non so se son stato chiaro =)

altra cosa, ma unset() libera la memoria occupata dalla variabile o semplicemente ne cancella il valore?

grazie

inviato 8 anni fa
larchitetto
X 0 X

supponiamo di avere questo script:

$test1="uno";
function test() {
   $test2="due";
}
$test1="uno";
function test() {
   $test2="due";
}

La prima istruzione porta PHP a creare una variabile e a valorizzarla con la stringa "uno", quindi avviene una allocazione di memoria.

La definizione delle 2 funzioni genera un errore dato il nome uguale. Supponiamo però che i nomi siano diversi, PHP non alloca spazio per le variabili $test2, fino a quando le funzioni non vengono invocate. $test2 verrà allocata alla chiamata della funzione e cancellata al termine della sua esecuzione.

La riga 5 non crea una nuova variabile $test1 perché precedentemente definita ma si limita a assegnare il nuovo valore (che coincide con quello vecchio) quindi non aumenta la memoria allocata.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

e fino a qua c'ero pure io... <.<

risposto 8 anni fa
larchitetto
X 0 X

mi spiego diversamente con un esempio:

script A include un altro script X; entrambi si comportano così come descritti nel post precedente. redirect (per una form ad esempio) verso lo script B che include X. alla nuova inclusione, le variabili precedentemente allocate (non quelle delle funzioni, ovviamente, che restano locali) saranno allocate nuovamente su un'altra porzione di memoria (due inclusioni, due allocazioni di memoria diverse) oppure il php si ricorda che già una volta aveva incluso quello stesso script e indi riutilizza quella memoria allocata per il medesimo script?

grazie

risposto 8 anni fa
larchitetto
X 0 X

Se ho capito bene le due inclusioni avvengono nel seguente ordine:

include() nel primo script A verso X

redirect verso altra pagina ....

include() nel secondo script B verso X

Se è così allora gli script A e B vengono elaborati in richieste successive dell'utente, pertanto sono completamente isolati tra loro e B non ha alcuna memoria delle risorse allocate da A. PHP separa gli spazi di indirizzamento della memoria impiegati da script invocati da differenti richieste dell'utente.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

A include X.

redirect su B.

B include X.

sono completamente isolati tra loro e B non ha alcuna memoria delle risorse allocate da A. PHP separa gli spazi di indirizzamento della memoria impiegati da script invocati da differenti richieste dell'utente.

indi l'interprete PHP, se ho capito bene, allocherebbe porzioni di memoria ad ogni richiesta (anche per uguali script inclusi n volte), perdendone traccia delle precedenti esecuzioni (di script, funzioni, inclusioni); tant'è che fra uno script e l'altro, e anche n esecuzioni di uno stesso script, le poche cose che si possono recuperare in memoria sono gli array globali (POST, GET, SESSION ad esempio - i valori di session ch'io sappia sono presenti sull'HD del server). indi accadrebbe che, sempre se ho capito bene, php perde si le tracce di script precedenti, ma non perde tempo a cancellare la memoria allocata finchè l'istanza è attiva, a meno di utilizzare unset sulle variabili durante l'esecuzione.

se è più o meno così (correggetemi dove erro), a sto punto unset avrebbe senso durante uno script, su variabili globali (non su session che non distruggerebbe il file), e non a fine script o su variabili locali; la differenza tra unset e array() o null sta nel fatto che unset distrugge completamente la variabile al contrario di array() e null che distruggerebbero solamente il valore, lasciando la variabile vuota. o no?

ditemi dove erro, per favore.

grazie

risposto 8 anni fa
larchitetto
X 0 X

Ci siamo (quasi).

fra uno script e l'altro, e anche n esecuzioni di uno stesso script, le poche cose che si possono recuperare in memoria sono gli array globali (POST, GET, SESSION ad esempio - i valori di session ch'io sappia sono presenti sull'HD del server)

POST e GET sono sempre diversi da una richiesta all'altra, quindi non sono allocazioni riusate dagli script. SESSION invece è una allocazione che viene ripristinata ad ogni esecuzione di uno script che contiene session_start(). Infatti $_SESSION è vuoto fino a che non viene avviata la sessione in uno script. Quindi non si tratta di una allocazione in memoria permanente ma piuttosto di una riallocazione delle stesse variabili salvate al termine del precedente script. La memoria di $_SESSION viene quindi allocata con session_start() e deallocata ad esempio al termine di uno script. I dati in essa contenuti vengono salvati sul server alla deallocazione della memoria e ripristinati con session_start()

unset dealloca la memoria (variabile e contenuto) associata ad una variabile, qualunque essa sia (variabile locale, globale, di sessione, ecc.)

Hai ragione quando dici che in diverse situazioni (es. variabili locali) questa operazione non ha molto senso poiché viene applicata su variabili "con il destino segnato".

unset su $_SESSION['test'] non distrugge la sessione ma elimina ogni traccia della variabile test in sessione. Alla fine dello script questa variabile non verrà salvata sul server.

Settare una variabile a null oppure a array() lascia inalterata la variabile (nel senso di etichetta) e ne svuota il contenuto. Si tratta quindi di una deallocazione solo parziale. Infatti la variabile continua ad esistere, e quindi ad occupare memoria, ma il suo contenuto è esiguo o inesistente. Si tratta quindi di un rispormio sulle risorse allocate dal contenuto della variabile e non dall'etichetta della variabile.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

con il "ci siamo (quasi)" intendevi che tutto quello che ho postato l'ultima volta è corretto, eccezion fatta dai tuoi ultimi chiarimenti?

grazie

risposto 8 anni fa
larchitetto
X 0 X
con il "ci siamo (quasi)" intendevi che tutto quello che ho postato l'ultima volta è corretto, eccezion fatta dai tuoi ultimi chiarimenti?

Si  O0

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

oh che bello :P

risposto 8 anni fa
larchitetto
X 0 X

Tieni presente una cosa, quando il PHP "gira" viene allocata una porzione di memoria per esso che è di una dimensione predefinita e dipende dalla dimensione dell'eseguibile (il php) e dalle varie parti che esso stesso richiama (moduli, motore Zend e altre cosucce), comunque sempre molto grande, e dentro quella porzione gira il php.

Gli script vengono copiati in memoria per essere eseguiti, tieni presente che il php è un linguaggio interpretato e non compilato, e in un'altra porzione di memoria vengono allocate tutte le variabili richiamate dallo script e queste porzioni sono separate script per script proprio per evitare che più chiamate dello stesso script possano andare a "sporcare" le stesse locazioni in memoria (cosa che fino a Windows 9.x o NT4 capitava di frequente con conseguenza di avere un freeze o macchina bloccata).

Questa memoria allocata viene in genere definita sul file di configurazione del server, più che altro viene definita come memoria utente, ogni persona che arriva sul sito fa girare uno script, ogni persona è un utente, in genere vengono allocati 8 megabyte ad utente, questa memoria è la memoria dati in cui girano gli script, in cui vengono allocate le variabili, mentre il php gira in una sua porzione di memoria.

Ovviamente è un discorso molto più complesso, complicato dal fatto che molto dipende da quale macchina viene usata per far girare il server.

Windows, BSD o gnu/linux sono già macchine con metodi di allocazione della ram diverso tra loro, poi anche tra le vecchie versioni di Windows ci sono differenze molto grandi.

Se hai interesse per questo prova a cercarti dei manuali su ELF (un esempio di quanta roba c'è http://www.google.it/search?hl=it&q=eseguibili+elf&btnG=Cerca&meta=) ELF è un formato per i dati compilati e dipende molto dal processore in uso.

PS ma perché ti interessa tanto sapere come il php gestisce i dati in memoria?

risposto 8 anni fa
Marco Grazia
X 0 X
PS ma perché ti interessa tanto sapere come il php gestisce i dati in memoria?

esattamente semplice curiosità :P

non mi sembrava giusto allocare variabili e vettori senza sapere quanto peso avrebbero avuto sulla memoria, quanti utenti avrebbe potuto reggere, e quindi in che modo ottimizzare tutto quest'allocare della memoria. insomma, se posso, perchè evitare di sprecare troppe risorse (teoricamente parlando)?

Gli script vengono copiati in memoria per essere eseguiti, tieni presente che il php è un linguaggio interpretato e non compilato, e in un'altra porzione di memoria vengono allocate tutte le variabili richiamate dallo script e queste porzioni sono separate script per script proprio per evitare che più chiamate dello stesso script possano andare a "sporcare" le stesse locazioni in memoria (cosa che fino a Windows 9.x o NT4 capitava di frequente con conseguenza di avere un freeze o macchina bloccata).

non ho ben capito sto pezzo qua, anche se ne "avverto" il senso, ma vorrei esserne sicuro.

grazie

risposto 8 anni fa
larchitetto
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda