Bkz this example (ve article Ben sorunun altına bağlı):
$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
Gördüğünüz gibi, bir noktada PHP neredeyse çift bellek kullanmıştı. De, bellekte önceki değişken tutarak $x için 'X'-dize atamadan önce, PHP, bellekte yeni bir dize oluşturur çünkü bu. Bu unset tınlı önlenebileceğini $x.
Başka bir örnek:
for ($i=0; $i<3; $i++) {
$str = str_repeat("Hello", 10000);
echo memory_get_peak_usage(), PHP_EOL;
}
Gibi bu irade çıktı üretir
375696
425824
425824
İlk tekrarda $str atama önce hala boş. İkinci tekrarında $str olsa oluşturulan dize yapacak. str_repeat ardından ikinci kez çağrıldığında, hemen $str üzerine yazmak, ama önce bellekte tahsis edilecek dize oluşturmak değildir. Yani $str ile sonuna kadar ve değer, atanmalıdır. Çift bellek. Eğer unset $str, bu olmayacak eğer:
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
Bu önemli mi? Peki, bağlantılı yazı ile oldukça iyi özetliyor
İşte bu dışında, kritik değildir.
Bu, artık onlara ihtiyacınız olduğunda değişkenleri unset zarar vermez. Belki paylaşılan bir bilgisayar üzerinde ve büyük veri setleri üzerinde bazı yineleme yapmak istiyorum. Unsetting Allowed memory size of XXXX bytes exhausted ile biten PHP engellemek istiyorsanız, o küçücük çaba değer.
Ne de dikkate alınmalıdır isteği ömrü sadece bir saniye bile, bellek kullanımını iki katına etkili servis edilebilir eşzamanlı istekleri azami miktarını yarıya olmasıdır. Yine hiçbir sunucunun sınırına yakın iseniz eğer, o zaman umurunda, ama kim, ardından basit bir unset daha RAM veya ek bir sunucu için size para kazandırabilir.