PHP Nesne Oluşturma ve Bellek Kullanımı

3 Cevap php

Temel kukla sınıfı:

class foo
{
    var $bar = 0;
    function foo() {}
    function boo() {}
}
echo memory_get_usage();
echo "\n";
$foo = new foo();
echo memory_get_usage();
echo "\n";
unset($foo);
echo memory_get_usage();
echo "\n";
$foo = null; 
echo memory_get_usage();
echo "\n";

Çıkışlar:

$ php test.php
353672
353792
353792
353792

Şimdi, PHP docs o (tavana isabet) ihtiyaç kadar bellek serbest olmayacağını söylüyorlar biliyorum. Ben çok daha uzun bir görevi var çünkü Ancak, ben bu nesnenin birçok örnekleri ile, çok daha büyük bir nesne kullanarak, küçük bir test olarak bu kadar yazdı. Ve bellek sadece sonunda bitiyor ve yürütme durdurma, tırmanıyor. Tek bir nesne böyle değil bellek için tüm alanı, egzoz sürece ben her biri (seri) ile işim bittikten sonra ben onları yok çünkü bu, büyük nesneler, bellek almak bile olsa, (bellek tükendi gerekir .)

Düşünceler?

3 Cevap

Eğer görevini yaparken çöp toplayıcısı durdurabilir herhangi döngüsel başvurular var mı?

Ben 1.000.000 nesneleri ve bellek yemiş değildi oluşturarak hızlı bir test koştu:

class foo
{
    var $bar = 0;
    function foo() {}
    function boo() {}
}

echo memory_get_usage() . "\n";

$foo = new foo();
unset($foo);

echo memory_get_usage() . "\n";

for ($i = 0; $i < 1000000; $i++)
{
	$var = 'foo' . $i; // Use a different variable name each time
	$$var = new foo();
	unset($$var);
}

echo memory_get_usage() . "\n";

65080 65384 65568 <- 1.000.000 nesneler için bir çok küçük bir artış yarattı ve yok

Nesneler & için PHP'nin destek sınıflar ver 5.2 çok verimli değil (ne de geçmişte olmuştur), ancak yaklaşan 5.3 ve 6.0 sınıfı açısından büyük bir revizyon ve kullanımı nesne ve her ikisine de hız ve bellek gelişmeler göreceksiniz.

Ayrıca PHP 5.2.x bazı çıplak kemik çerçeveler yazılı ve bellek kullanımını şaşırtıcı şişirilmiş da bulduk. Güçlü bir multi-core işlemciler ve ram ne kadar ucuz olduğunu düşünüyor olsa da, ben sizin için en mantıklı ve daha RAD oluşturur kurulum bir şekilde kodlama tutmak söyleyebilirim.

Smarty veya Drupal kullanarak iş proje bitiş hızlı yaparsa, o zaman bunları kullanmak, ya da ne olursa olsun özel şeyler yapmak. Yarının sürümü bazı kayda değer iyileşmeler (gerçek dünya kriterler aynı kod% 30 hız artışı göstermiştir) çünkü bugünün yoksul bellek / hız kullanımı OOP veya çerçeveler kapalı seni ezmesine izin vermeyin.

PS: Eğer kurulum ile yanlış bir şey var, ben Windows XP üzerinde PHP 5.2.8 Apache w / üzerinde aynı kodu koştu ve var: 60872 61080 61080 61080

Burada döngüsel başvurular ile revize edilmiş bir örnek:

<?php
class foo
{
    public $bar = 0;
    function foo(){}
    function boo(){}
}

echo memory_get_usage() . "\n";

$foo = new foo();
unset($foo);

echo memory_get_usage() . "\n";

$arr = array(new foo());

for ($i = 1; $i < 1000000; $i += 2)
{
    $arr[$i] = new foo();
    $arr[$i - 1] = new foo();
    unset($arr[$i], $arr[$i - 1]);
}

echo memory_get_usage() . "\n";

for ($i = 1; $i < 1000000; $i += 2)
{
    $arr[$i] = new foo();
    $arr[$i - 1] = new foo();
    $arr[$i]->bar = $arr[$i-1];
    $arr[$i-1]->bar = $arr[$i];
    unset($arr[$i], $arr[$i - 1]);
}

echo memory_get_usage() . "\n";

PHP 5.3.6 (cli) ile Çıkışlar:

644392
644392
644848
1628592