PHP: register_shutdown_function vs yıkıcı

3 Cevap php

Ben anında bir PNG görüntüsünü oluşturur ve tarayıcıya gönderir bir PHP sınıfı var. PHP kılavuzu I imagedestroy function belleği serbest ucunda denir emin olmak gerektiğini söylüyor. Ben bir sınıf kullanarak olmasaydı şimdi, bu gibi bazı kod olurdu:

function shutdown_func() 
{
    global $img;
    if ($img)
        imagedestroy($img);
}
register_shutdown_function("shutdown_func");

Ancak, benim sınıf için uygun bir yer imagedestroy sınıfta 'yıkıcı bir çağrı olacağını inanıyorum.

Yıkıcılar aynı şekilde kapatma işlevleri yapar denilen olsun olmadığını öğrenmek için başarısız oldu? Kullanıcı tarayıcıda STOP düğmesine bastığında Örneğin, yürütme durur.

Not: Eğer cevap yazmak ne olursa olsun, onu destekleyen bazı madde veya manuel sayfa (URL) işaret edin.

3 Cevap

Ben sadece Apache ile test, PHP, Apache modülü olarak kullanılmaktadır. Böyle bir sonsuz döngü yarattı:

<?php
class X
{
    function __destruct()
    {
        $fp = fopen("/var/www/htdocs/dtor.txt", "w+");
        fputs($fp, "Destroyed\n");
        fclose($fp);
    }
};

$obj = new X();
while (true) {
    // do nothing
}
?>

İşte ben öğrendim ne:

  • Firefox'ta STOP düğmesine basarak bu komut dosyasını durmuyor
  • Ben Apache kapanırsa, yıkıcı denir almaz
  • PHP max_execution_time ulaşır ve destuctor denilen almaz zaman durur

Ancak, bu yapıyor:

<?php
function shutdown_func() {
    $fp = fopen("/var/www/htdocs/dtor.txt", "w+");
    fputs($fp, "Destroyed2\n");
    fclose($fp);
}
register_shutdown_function("shutdown_func");

while (true) {
    // do nothing
}
?>

shutdown_func çağrılır. Yani bu sınıf destuctor kapatma fonksiyonları gibi iyi değil demektir.

Eğer finish what you start, ben yıkıcı serbest arama için doğru yer olduğunu söyleyebilirim gerektiği ilkesine dayanarak.

Nesnenin bertaraf olduğunda destructor bir shutdown function komut dosyası yürütme bitinceye kadar denilen olmayacak ise, adı verilecek. Wolfie'den tarafından belirtildiği gibi zorla sunucu veya komut dosyasını durdurmak ise, bu mutlaka olmayacak, ancak o zaman, PHP tarafından ayrılan bellek yine serbest olacak.

Ayrıca Wolfie'den tarafından belirtildiği komut kapandığında, PHP komut dosyası kaynaklarını özgür olacak, böylece sadece bu nesnelerden birini başlatmasını iseniz, o zaman muhtemelen büyük bir fark olmaz. Daha sonra bunları başlatmasını sonunda, ya bir döngü içinde ancak bunu yaparsanız, o zaman muhtemelen gelecek aklı uğruna, ben dönmek yüzden, bellek kullanımı ani bir başak hakkında endişelenmenize gerek istemiyorum benim Orijinal öneri; yıkıcı koydu.

Ben cevapsız büyük bir şey komut sonlandıktan sonra PHP komut dosyası yürütme sırasında ayırdığı tüm belleği serbest olduğunu düşünüyorum. Kullanıcı stop-düğmesine bastığında bile tamamlanıncaya kadar, PHP script süreçleri, (daemon nasıl zeki bağlı olarak ya da değil,) ziyaretçiye hizmet için HTTP daemon onu geri verir.

Yani, açıkça komut yürütme sonunda belleği boşaltarak biraz gereksiz olduğunu. Bazıları bunu yapmak için iyi bir şey olacağını iddia olabilir, ama yine de gereksiz bulunuyor.

Nesne yok Ama ne zaman, sınıf yıkıcılar bir konuda, onlar da açıkça tarafından unset() veya komut tamamlama / fesih de, denir.

Bitmapler (yükseklik * genişlik * bit derinliği * 3 (+ şeylerin bellek tarafında ıkınma olabilir gibi açıkça görüntü manipülasyonu kullanılan belleği boşaltarak geliştirici öneri, sadece bir bellek sızıntısı için değil kesinlikle emin olmak için emin 1 Bir alfa kanalı varsa))

Lütfen Wikipedian ihtiyaçlarını karşılamak için: