Yuvalama işlevi çağrı sınırı artırılıyor


127

PHP bir çok kötü bir sınır yoktur: Bazı fonksiyon a1 () aramalar (a2'ye o) çağırırsanız, aramalar A3 o ... böylece ne zaman a99()arayacak a100()göreceğiniz

Önemli hata: Maksimum işlev iç içe geçme düzeyi '100'e ulaşıldı, iptal ediliyor!

100 iç içe geçme çağrısı sınırını 500 veya 10000'e yükseltmenin herhangi bir yolu var mı?

Bu benim için kritik, çünkü çok sayıda geri arama içeren olay tabanlı bir sistem geliştiriyorum.


12
100, bir etkinlik çerçevesi için bile biraz aşırı görünüyor.
Ignacio Vazquez-Abrams

7
@Ignacio: Odak bir olay çerçevesi üzerinde olsa bile, çok daha yüksek bir yuvalama seviyesi gerektiren özyinelemeli bir işleve sahip olmak oldukça basit. Bu tür senaryolarda on binlerce (hatta milyonlarca) nadir değildir.
Abel

stackoverflow.com/a/36440027/2652524 Bu yanıtı kullanarak benimkini
Gujarat Santana

Yanıtlar:


254

Bu hata mesajı özellikle XDebug uzantısından gelir. PHP'nin kendi içinde bir işlev iç içe geçme sınırı yoktur. Php.ini'nizdeki ayarı değiştirin :

xdebug.max_nesting_level = 200

veya PHP kodunuzda:

ini_set('xdebug.max_nesting_level', 200);

Bunu gerçekten değiştirmeniz gerekiyorsa (yani özyinelemeli bir işleve alternatif bir çözüm varsa), kod olmadan söyleyemem.


Ben de aynı sorunu yaşadım. Max_nesting_level değerim 100 olarak ayarlandı, ancak benim durumumda bazı durumlarda 1000 özyinelemeli çağrı olması mümkün. Bu xdebug hatasını önlemek için 10000 olarak ayarladım. Her durumda, sınırsız PHP'ye izin vermekten her zaman daha iyidir.
SkaJess

9
Eğer php.ini'nizde bu xdebug.max_nesting_level = 100seçenek yoksa, sadece onu yapıştırın.
M. Reza Nasirloo

@Pedram Bunu bir php ini dosyasında kopyalamanın doğru yolu /etc/php5/apache2/conf.d/20-xdebug.ini içindedir, normal php.ini dosyasında değil. Sadece iyi bir antrenman
Enrique Quero

3
@EnriqueQuero Sisteme ve işletim sistemine bağlıdır.
netcoder

İşe yarıyor! XDebug kullanıyor olsanız da kullanmasanız da, php.ini'de satırın dışına yorum yapsanız da. Açıkça kullandım: ini_set ('xdebug.max_nesting_level', -1);
user2928048

13

Zend, IonCube veya xDebug kurulu mu? Eğer öyleyse, muhtemelen bu hatayı nereden alıyorsunuz.

Birkaç yıl önce bununla karşılaştım ve sonunda Zend bu limiti PHP değil oraya koydu. Tabii ki onu kaldırmak 100 yinelemeyi geçmenize izin verecek, ancak sonunda bellek sınırlarına ulaşacaksınız.


1

Şahsen ben bunun, ayarlanması gereken bir ayarın aksine bir hata olduğunu öneririm. Kodumda bunun nedeni, denetleyicilerimden birinin içindeki kitaplıkla aynı adı taşıyan bir sınıfa sahip olmamdı ve onu tetikliyor gibiydi.

Hataların çıktısını alın ve bunun nerede tetiklendiğini görün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.