Nasıl "bellek boyutu bitkin İzin" ölümcül bir hatadan kurtarmak için

7 Cevap php

Eğer PHP ölümcül hatadan kurtarmak için herhangi bir çözüm biliyor musunuz: "Allowed memory size ... exhausted"

Ben önemli bir hata göründüğünde denir bir kapatma işlevi var. Bu fonksiyon, bir ErrorException oluşturmak ve bunu kaydeder.

Sorun: yok daha fazla bellek kullanılabilir olduğunda, (Ben Zend Framework ile, FirePHP yoluyla, kundakçı giriş) hata giriş yapamazsınız.

Peki ben hata kaydediliyor ve böylece "how to recover from it", diğer herhangi bir hata olarak (benim durumumda Firebug), temel hata günlüğünü gerçekleştirmek için nasıl ve Zend Framework Başlıkları göndermesine izin demek?

Teşekkürler

7 Cevap

Bu hata ölümcül bir hatadır - bunu kurtarmak değil demektir. PHP bellek limitini isabet varsa, bu onun yürütme yürütmek için ihtiyaçları istisna ve diğer herhangi bir bellek oluşturmak için daha fazla bellek tahsis etmek mümkün olmayacaktır.

Orada hata başka bir türüdür - "catchable ölümcül hata" adından da anlaşılacağı gibi, bir try / catch yakalanmış olabilir, ama ne yazık ki bellek boyutu tahsisat bunlardan biri değildir.

Aklıma biri size bellek yoğun çalışmasını yapıyoruz zaman elle (örneğin her döngü yineleme) düzenli olarak get_memory_usage() sorgulamak ve bazı failsafe üzerine gittiğinde senin başlıklarını / hata dökümü olduğunu betik limitin altında değer. Bu çok senaryonu yavaşlatacak, ama en azından bir şeyler alırsınız.

Yoksa, ve sen, bunu exec kullanarak web tabanlı malzeme içerisinden denilen bir CLI tabanlı komut dosyası olarak bellek yoğun şeyler çalıştırmak mümkün olmayabilir. CLI kısmı bitti düşebilir, ama web parçası üzerinde rapor mümkün olacak.

Denenmemiş bir hüner için bir fikrim var ve ben yardımcı olmadığını bilmek mutlu olurdu. Ilk kapatma fonksiyonu kayıt ve kapatma işlevin kod ilk çalıştırıldığında serbest zaman bazı küresel değişkeni ayırmak. Daha sonra durum nesnesi oluşturmak için yeterli bellek olabilir. Çalıştı ve burada kodu yayınlamak lütfen bana bildirin.

Bu benim için iyi çalıştı:

try {
    ini_set('memory_limit', (ini_get('memory_limit')+1).'M');
} catch(Exception $e) {}

Bu bellek sınırı formatında varsayar 123M.

PHP hataları apache hata günlüğüne /path/to/apache/logs/error.log varsayılan olarak gönderilir ve orada görebilirsiniz.

if((memory_get_usage() / 1024 /1024) < 70)

Ben sadece 1024 ile memory_get_usage bölmek '70 'normal' megabayt değer 'karşılaştırmak için kare.

Ben döngü için bir iç php ile hafıza problemleri koştu ve deyimi bir ölümcül hata yola benim komut vermesini engellemek için bu basit yazdı. Ayrıca, ben işletim oldu sunucu bana hafıza limitini değiştirmek için izin vermedi (bu genellikle openshift veya dreamhost gibi büyük web host gibi bazı bulut teklifleri böyledir.) Ben gerçekten (herhangi bir ciddi performans bozulmaları fark etmedi php 5.3 hangi tür biraz farklı herhangi bir oranda işlev çağrısı zorlayabilir herhangi yükü ağır basar bir ölümcül hata veren bir komut dosyası performans dolaylı olarak php 4.x veya 5.x .. daha bu. Ve kolları fonksiyonları da önleyecektir olabilir tüm ram tüketen bir kaçak script.

Birçok iddia edilebilir; oh hey yazılım optimize edilmemiştir. Evet. Muhtemelen haklısınız; ancak karmaşık veri ile ona daha fazla bellek atmak gerekir önce sadece çok performans dışarı sıkmak olabilir setleri; ve bir ajax akışında bellek hataları aşağı avcılık çok sinir bozucu olabilir; Emin olmadığınız zaman özellikle günlük dosyaları nerede.