PHP ulaşan bellek limiti nedenleri yeniden çalıştırmak için fonksiyon

2 Cevap php

Yani çok garip bir sorunu var.

(Bu aynı zamanda 5.2.6 çalıştıran bir lamba sunucuda olur rağmen, MAMP parçası olarak) Öncelikle, ben Zend Framework 1.7.2 kullanarak bir web sitesi yazma, PHP 5.2.6 kullanıyorum.

İkincisi, ben yazıyorum yazılım bellek bir sürü gerektirir oldukça karmaşık istatistiksel bir hesaplama yapar. Genellikle bellek sınırı olarak ayarlanmış 128MB ile iyi çalışır.

Yani burada eğlenceli bir parçası.

Ben, bu ihtiyacı veri alma gerekli hesaplamaları yaparak, daha sonra değerler döndürmek için münhasıran sorumlu bir sınıf var. Çalıştıktan sonra PHP hala kapsamda olduğunu düşünüyor gibi görünüyor, ben bunu unsetting edilmiş ve denir hangi işlevini bitirme rağmen, bunun için bellek tutan (bu hesaplamanın ikinci bir çalışma oldu sorunlara neden oldu ) bellek sınırına isabet ve komut öldü. Bu hesaplama bu işlev içinde bir kez çalıştırıldıktan sonra, başka bir hesaplama (bu yürütme aynı çalışma sırasında) yapmak için başka bir işlevin tekrar çalıştırılır. Garip şeyler olsun burada.

Ben bu ikinci hesaplama çalıştırırsanız, arama fonksiyonu, bu hesaplama yapar kodu içinde bu işlev için hiçbir çağrı var olmasına rağmen, yine çalışır. Ayrıca, herhangi bir hata veya uyarı PHP görünür.

Ben (1024 MB diyelim) bellek sınırı artırmak Ancak, it doesn't happen. genel arama fonksiyonu bir kez çalışır ve onun neşeli yol boyunca devam eder.

Yani, bana aşağıda bir harita çizelim.

function A{
   calls function B
   calls function D
}

function B{
   calls calculation function C
}

function D{
   calls calculation function C
}

with 128 MB of memory, path of functions is as follows (in and back to the caller): A->B->C->B->A->D->C->D->then it runs A from the start of the function, for some reason, to the end (there's a conditional case which becomes true during this execution path, so the path doesn't repeat)

with 1GB of memory, path of functions is as follows: A->B->C->B->A->D->C->D->end of A, which is what is supposed to happen.

Ben fonksiyonu D ikinci hesaplama kaldırırsanız, bu çalışıyor. Eğer ben hafıza sınırını çalışır.

Soru: Ben PHP bellek yönetimi bir hata bulduk? Ya da belki de Zend Framework? Yine; php.ini içinde komut başına hafıza limitini artırarak, ben bu sorunu görmüyorum. Yani, ya da çok fazla bellek kullanan bu hesaplama çalışan ikinci örneğini kaldırın.

Ben bu (Ben geri çağıran fonksiyonun başlangıcına atlama bu tür görmedim) yaptığı şekilde oddness rağmen, bu olur yolu çok, çok eminim. Genellikle bu durumda ne olacağını PHP dışarı hata ve ölmek, arama fonksiyonunu yeniden olmaz olmasıdır.

2 Cevap

Eğer debug_backtrace() kullanarak program akışı doğrulandı mı? Ben bu kodu php zend motorun daha bu nedeni olduğunu daha muhtemel olduğunu düşünüyor. Ben her işlevin başında bir dosyaya iz bir dökümü koyarak ve bu ilk analiz öneriyoruz:

function myFunction() {
    file_put_contents(print_r(debug_backtrace(), true) . "\n--\n", 'trace.txt');
    //...

Öncelikle, E_STRICT dahil tüm error reporting açın.

Ben düşük bellek beklemediğiniz bir yürütme yolu neden olur, ve belki ek hata çıktı fazla ışık tutacak şüpheli olur.