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.
* (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
Grazie per questi collegamenti. Danno spiegazioni eccellenti. – dd0x