2010-04-11 14 views
29

Sono un po 'nuovo in PHP e mi chiedo: quanto è importante eliminare le variabili in PHP? So che in linguaggi come C liberiamo la memoria allocata per prevenire perdite, ecc. Usando unset su variabili quando ho finito con esse, questo aumenterà significativamente le prestazioni delle mie applicazioni?Quanto è importante disinserire variabili in PHP?

C'è anche un punto di riferimento ovunque che confronta la differenza tra l'utilizzo di unset e non l'uso di unset?

+0

* (legati) * http://www.php.net/manual/en/features.gc.refcounting-basics.php e http://blog.preinheimer.com/index.php?/ archivi/354-Memory-usage-in-PHP.html – Gordon

+0

Grazie per questi collegamenti. Danno spiegazioni eccellenti. – dd0x

risposta

49

Vedi this example (e la article ho collegato al di sotto della domanda):

$x = str_repeat('x', 80000); 
echo memory_get_usage() . "<br>\n";  // 120172 
echo memory_get_peak_usage() . "<br>\n"; // 121248 

$x = str_repeat('x', 80000); 
echo memory_get_usage() . "<br>\n";  // 120172 
echo memory_get_peak_usage() . "<br>\n"; // 201284 

Come si può vedere, ad un certo punto PHP aveva usato quasi il doppio della memoria. Questo perché prima di assegnare la stringa 'x' a $x, PHP crea la nuova stringa in memoria, mantenendo anche la variabile precedente in memoria. Questo potrebbe essere stato impedito con unset ting $x.

altro esempio:

for ($i=0; $i<3; $i++) { 
    $str = str_repeat("Hello", 10000); 
    echo memory_get_peak_usage(), PHP_EOL; 
} 

Questa volontà uscita simile

375696 
425824 
425824 

Alla prima iterazione $str è ancora vuota prima assegnazione. Nella seconda iterazione, invece, $str manterrà la stringa generata. Quando viene chiamato per la seconda volta lo standard str_repeat, non verrà sovrascritto immediatamente $str, ma prima verrà creata la stringa che deve essere assegnata in memoria. Quindi finisci con $str e il valore che dovrebbe essere assegnato. Doppia memoria. Se viene disattivata $str, questo non accadrà:

for($i=0;$i<3;$i++) { 
    $str = str_repeat("Hello", 10000); 
    echo memory_get_peak_usage(), PHP_EOL; 
    unset($str); 
} 

// outputs something like 
375904 
376016 
376016 

importa? Bene, l'articolo collegato lo riassume abbastanza bene con

Questo non è critico, tranne quando lo è.

Non fa male separare le variabili quando non ne hai più bisogno. Forse sei su un host condiviso e vuoi fare un po 'di iterazione su dataset di grandi dimensioni. Se il disinserimento impedisse a PHP di terminare con Dimensioni di memoria consentite di XXXX byte esaurite, allora vale la pena.

Quale dovrebbe anche essere preso in considerazione è che, anche se la durata richiesta è solo un secondo, raddoppiando l'utilizzo della memoria dimezza efficacemente la quantità massima di richieste simultanee che possono essere serviti. Se non sei comunque vicino al limite del server, allora a chi importa, ma se lo sei, un semplice unset potrebbe farti risparmiare soldi per più RAM o un server aggiuntivo.

+0

In un progetto corrente sto usando PHP per generare un numero di pagine HTML di dimensioni variabili muovendomi attraverso un ciclo, quindi dovrei sicuramente disinserire la variabile che sta trattenendo il contenuto alla fine di ogni ciclo. Ciò potrebbe potenzialmente essere "critico" corretto? – dd0x

+0

@ dd0x In teoria, si. Ma in pratica, dovresti usare qualcosa come XDebug per profilare la tua applicazione per vedere se è veramente critica. Considero di disattivare in PHP molto più di un'ottimizzazione della scalabilità che di una necessità assoluta. – Gordon

+0

@ dd0x Solo per aggiungere, PHP ha un garbage collector che garantisce il 99,9% delle volte che non devi preoccuparti. – Yacoby

3

Le applicazioni scritte in lingue come C di solito vengono eseguite per molte ore. Ma il solito runtime dell'applicazione php è di soli 0,05 secondi. Quindi, è molto meno importante usare unset.

+5

Anche se può essere vero, non è la risposta giusta. Ho eseguito script PHP per giorni. Poichè il PHP è spazzato via, la quantità di tempo in cui uno script è stato eseguito è per la maggior parte irrilevante. – Yacoby

+2

La risposta dà anche l'impressione che 'unset' sarebbe richiesto in uno script a esecuzione lunga e che' unset' è l'equivalente di 'free'. – Yacoby

+0

@Yacoby "* Ho eseguito script PHP per giorni *" Forse è necessario considerare l'utilizzo di qualcos'altro per attività specifiche. PHP è più adatto per le applicazioni Web e le pagine Web non devono essere eseguite per giorni. Naturalmente, i server web sono molto più potenti ora da 5 anni (anche quelli di hosting a basso costo per £ 3 al mese) e la garbage collection di PHP è migliorata. Non è consigliabile disabilitare le variabili per liberare risorse. – James

7

Ci sono molte situazioni in cui unset non in realtà distolga gran parte di qualcosa, quindi il suo uso è generalmente piuttosto inutile a meno che il flusso logico del codice non richieda la sua non esistenza.

+3

Va anche detto che tutta la memoria viene liberata alla fine dell'esecuzione dello script comunque, quindi il disinserimento prima della fine dell'esecuzione non farà molto bene (e potrebbe anche essere dannoso) per le prestazioni. – mattbasta

0

Dipende, dovresti assicurarti di avere unset stringhe molto lunghe (come il contenuto di un post di blog selezionato da un db).

<?php 
$post = get_blog_post(); 
echo $post; 
unset($post); 
?> 
Problemi correlati