2013-10-31 29 views
15

Birisi lütfen gc_collect_cycles işlevinin hangi durumlarda yararlı olabileceğini açıklayabilir mi? Önemli bir bellek kullanımı gerçekleşmeden önce çağrılmalıdır?Ne gc_collect_cycles işlevi yararlıdır?

+0

Bu yardımcı olur mu? http://php.net/manual/en/features.gc.collecting-cycles.php –

+0

gc_collect_cycles sadece GC * * devre dışı * için gerçekten yararlıdır. – user2864740

cevap

16

PHP'de "Çöp Toplayıcısı" varsayılan olarak etkindir. "Çöp" tarafından kullanılan belleği boşaltmak için kullanılır. gc_collect_cycles() mevcut herhangi bir çöp çevriminin toplanmasını zorlar. Toplanan (serbest) döngülerin sayısını döndürür (nesneler, değişken değerler ...). Etkinleştirilmiş Çöp Toplayıcı, bu işlevi dahili olarak zaman zaman serbest kaynaklara çağırır. Çoğu durumda PHP betiği çok kısa bir süre yaşıyor. Bu durumda tüm çöpler işin sonunda hiçbir çöp toplama olmadan imha edilecek.

Bazen elle GC yönetmek için ihtiyaç duyulan:

  1. gc_disable() bazı uzun işlemlerini hızlandırmak değil, aynı zamanda bazı bellek genel giderler ile sonuçlanır olabilir. GC'nin doğru anlarını belirtmek için
  2. gc_collect_cycles() kullanılabilir.

gc_collect_cycles() - debugging işlevini kullanmanın bir başka nedeni. Varsayalım, memory_get_usage() ile bir kod bloğunun hafıza tüketiminin ne olduğunu bilmek istersiniz. İlk önce GC'yi devre dışı bırakmanız gerekir, başka bir yerde yanlış sonuçlar elde edersiniz. Bundan sonra, GC ve uygulamanız tarafından tüketilen zamanı ayırmak istersiniz. Yani gc_collect_cycles()'u arayın ve zamanlamaları/belleği önce ve sonra ölçün.

Küçük bir örnek:

class A { 
    public $ref; 
    public $name; 

    public function __construct($name) { 
    $this->name = $name; 
    echo($this->name.'->__construct();'.PHP_EOL); 
    } 

    public function __destruct() { 
    echo($this->name.'->__destruct();'.PHP_EOL); 
    } 
} 

gc_disable(); 

$a1 = new A('$a1'); 
$a2 = new A('$a2'); 

$a1->ref = $a2; 
$a2->ref = $a1; 

$b = new A('$b'); 
$b->ref = $a1; 

echo('$a1 = $a2 = $b = NULL;'.PHP_EOL); 
$a1 = $a2 = $b = NULL; 
echo('gc_collect_cycles();'.PHP_EOL); 
echo('// removed cycles: '.gc_collect_cycles().PHP_EOL); 
echo('exit();'.PHP_EOL); 

Will çıkışı:

$a1->__construct(); 
$a2->__construct(); 
$b->__construct(); 
$a1 = $a2 => $b = NULL; 
$b->__destruct(); 
gc_collect_cycles(); 
$a2->__destruct(); 
$a1->__destruct(); 
// removed cycles: 4 

Bu sorulduğunda sadece $b tahrip edildi anlamına gelir. Diğer $a1 ve $a2 döngüsel referanslara sahiptir ve name özellikleri de bellek tüketir. İki nesne + iki dizgi = 4 (gc_collect_cycles() tarafından kaldırıldı).

İlgili konular