2012-10-19 9 views
18

Sto lavorando a un'applicazione web che vede decine di utenti simultanei al secondo. Ho una classe che verrà istanziata più volte all'interno dello stesso caricamento della pagina. In quella classe, ho alcune proprietà che saranno sempre le stesse su ogni oggetto, quindi sto pensando di dichiarare queste proprietà come static nel tentativo di ridurre la memoria che verrà utilizzata quando istanze multiple di questa classe vengono istanziate durante il stessa richiesta di pagina.L'utilizzo di metodi e proprietà statici in PHP utilizza meno memoria?

In questo modo si utilizzerà meno memoria per questa applicazione perché PHP può memorizzare il valore delle proprietà statiche solo una volta? Lo farà salvando la memoria tra utenti concorrenti o solo all'interno di ogni processo PHP?

Come funziona questo metodo? Se ciò significa che gli oggetti possono riciclare gli stessi metodi, allora perché non tutti i metodi di una classe dovrebbero essere dichiarati statici se si sta tentando di salvare in memoria?

Non mi sento del tutto a mio agio con il perché e quando si dichiarerebbe una proprietà o un metodo statico, ma capisco che dichiararli come statici consente loro di accedervi senza istanziare un oggetto della classe (questo sembra un hack ... questi metodi e proprietà dovrebbero essere altrove ... no?). Sono particolarmente interessato al modo in cui una dichiarazione static influisce sull'utilizzo della memoria nel tentativo di mantenere l'utilizzo della memoria il più basso possibile sul mio server web ... e in generale, quindi ho una migliore comprensione di ciò che sta accadendo.

+5

Non capisco perché questo è stato chiuso. La domanda è molto specifica e c'è sicuramente una risposta esatta e non discutibile. –

+0

Domanda veramente buona e precisa ma voglio sottolineare la visibilità di una funzione in PHP (che è derivata da OOP) per la tua domanda "_Se questo significa che gli oggetti possono riciclare gli stessi metodi, allora perché non tutti i metodi di una classe viene dichiarata statica se si sta tentando di salvare in memoria? _ ". Ci sono le funzioni MAGGIO essere statiche, e ci sono le funzioni DEVE NON statiche - quelle che ottiene/imposta le variabili di classe che dipendono dalla procedura di inizializzazione della classe per così dire. Il limite principale è IL vero oggetto (istanziazione) di cui si ha a che fare in quel momento. – ozanmuyes

risposta

15

Quando si dichiara un metodo/variabile di classe come statico, viene associato e condiviso dalla classe, non dall'oggetto. Da una prospettiva di gestione della memoria, ciò significa che quando la definizione della classe viene caricata nella memoria heap, questi oggetti statici vengono creati lì. Quando l'oggetto effettivo della classe viene creato nella memoria dello stack e quando vengono eseguiti gli aggiornamenti sulle proprietà statiche, viene aggiornato il puntatore all'heap che contiene l'oggetto statico. Questo aiuta a ridurre la memoria, ma non di molto.

Da un paradigma di programmazione, le persone in genere scelgono di utilizzare le variabili statiche per vantaggi architettonici più dell'ottimizzazione della gestione della memoria. In altre parole, si potrebbero creare variabili statiche come hai detto, quando si vuole implementare un modello singleton o factory. Fornisce metodi più potenti per sapere cosa sta succedendo a un livello di "classe" rispetto a ciò che accade a livello di "oggetto".

4

L'utilizzo di metodi e proprietà statiche in PHP utilizza meno memoria?

Probabilmente. Ma perché dovresti rovinare la tua architettura OOP?

È importante?

Probabilmente no. Ciò che prende la memoria è PHP stesso. Sono fermamente convinto che la rimozione di alcuni byte perché si utilizzano metodi statici non farà la differenza. Invece, non caricare moduli inutili. Se non usi GD, non caricarlo. Attiva la memorizzazione nella cache per ridurre il numero di volte in cui viene chiamato PHP.

+0

Ci sono alcuni buoni suggerimenti qui, specialmente riducendo quello che sto caricando in PHP. Grazie. –

+0

@ T.BrianJones Naturalmente potrei approfondire questo argomento, ma è al di fuori della portata della tua domanda. Ma puoi cercare APC, memcache, ... – Tchoupi

+0

@ Mathieu Imbert: potresti spiegare quando dici "se non usi GD, non caricarlo". Vuoi dire di non caricarlo su tutta l'estensione GD nella configurazione di 'php.ini'? –

1

Le chiamate al metodo statico sono più veloci su molte iterazioni, ma i metodi statici non risparmiano realmente memoria.

Se la classe che si sta dichiarando non ha proprietà che devono essere univoche per ogni istanza di oggetto, è possibile dichiarare ogni metodo e proprietà come statici. Se, tuttavia, si hanno proprietà che devono essere associate a ciascun oggetto, i metodi statici non sono utili. Il motivo è che all'interno dei metodi statici non esiste alcun riferimento a $this, quindi non è possibile fare riferimento alle proprietà dell'oggetto dai metodi statici.

Leggere su Static Keyword per una migliore comprensione di questo.

+1

In realtà i metodi normali sono più veloci (e ho il sospetto che l'utilizzo della memoria potrebbe avere una correlazione simile). Il costo aggiuntivo è nell'istanziazione dell'oggetto. Fondamentalmente, se stai eseguendo più di 4 metodi sullo stesso oggetto, allora l'uso totale di un oggetto diventa più efficiente dal punto di vista del tempo. Inoltre c'è quella cosa minore dei normali metodi che sono OOP (con tutto ciò che riguarda il polimorfismo e l'iniezione di dipendenza) ei metodi statici che fanno parte del paradigma di programmazione procedurale. –

0

Non sono un esperto nella gestione della memoria di PHP, ma direi che NON risparmi molto. Se e quanto si salva dipende da alcuni aspetti:

  • La dimensione dell'oggetto (quando si crea un'istanza, quanti altri dati mantiene l'oggetto).
  • Il numero di oggetti creati.

Soprattutto il numero di oggetti è importante. Se hai una sola istanza, risparmi il 50%. In questo caso:

Caso A: statico: non si istanzia l'oggetto, ma si utilizza semplicemente la definizione di classe, che viene memorizzata nella memoria. Ma la definizione della classe viene caricata per ogni RICHIESTA, il che significa che hai la stessa quantità di definizioni di classe nella memoria quando hai richieste concorrenti.

Caso B - Istanze: oltre al caso A si dispone anche di un'istanza di questo oggetto per ogni richiesta, quindi raddoppiare l'utilizzo della memoria per questa parte del software.

Infine: se è più semplice lavorare con i parametri statici anziché istanziare la classe ogni volta, è necessario seguire il metodo statico. Ma non aspettarti troppo di un aumento di memoria.

6

Guarda statica e prove di Singleton: http://moisadoru.wordpress.com/2010/03/02/static-call-versus-singleton-call-in-php/

Nota: per alcuni motivi, StackOverflow non ha mostrato argomento multilne, quindi sono l'aggiunta di una foto.

Number of runs Singleton call time (s)  Static call time (s) 
100    0.004005     0.001511 
1,000   0.018872     0.014552 
10,000   0.174744     0.141820 
100,000   1.643465     1.431564 
200,000   3.277334     2.812432 
300,000   5.079388     4.419048 
500,000   8.086555     6.841494 
1,000,000  16.189018     13.696728 

Checkout maggiori dettagli qui: https://stackoverflow.com/a/3419411/260080

+0

È possibile accedere a una proprietà dichiarata come statica all'interno di un oggetto classe istanziato - provarlo – raidenace

+0

True. Ehm, questo è da php.net Sono stato provato, ma perché è documentato lì non lo sapevo. –

+0

Provalo ancora :-) – raidenace

-1

Se si condividono i dati utilizzano una statica. È più veloce e ti risparmia il processo di creazione di oggetti. I single vincono contro la statica quando hai bisogno di un singolo punto di ingresso. Ho parlato di questo sul mio blog circa 1 settimana fa.

+0

Grazie per la spiegazione Pauly. Ho sbagliato? Stavo promuovendo spudoratamente il mio sito web commerciale? Pauly rende così un posto migliore! – CodeAngry