Soru PHP'de “Ölümcül hata: '100' değerinde maksimum işlev yuvalama seviyesi, ulaşıldı!”


Bir html dosyasındaki tüm URL'leri bulan ve keşfedilen URL'lere bağlı her bir html içeriği için aynı işlemi tekrarlayan bir işlev yaptım. Bu fonksiyon tekrarlayıcıdır ve sonsuza dek devam edebilir. Bununla birlikte, yinelemede 100 tekrardan sonra durgunluğun durmasına neden olan bir global değişken belirleyerek bir sınırlama getirdim.

Ancak, php bu hatayı döndürür:

Önemli hata: '100' değerinin maksimum işlev yuvalanma düzeyi   durduruluyor! içinde   D: \ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php on line   1355

ERROR

Burada bir çözüm buldum: Artan iç içe geçme işlevi çağrı sınırı ama bu benim durumumda çalışmıyor.

Yukarıda bahsi geçen linkten cevaplardan alıntı yapıyorum. Lütfen bunu dikkate al.

"Zend, IonCube veya xDebug var mı? Eğer öyleyse, muhtemelen bu hatayı alıyorum.

Buna birkaç yıl önce rastladım ve Zend'in o limiti buraya koyarak değil, PHP'ye dönüştüğü ortaya çıktı. Tabii ki kaldırma işlemi,> 100 yinelemeyi geçersiniz, ancak sonunda bellek sınırlarına ulaşırsınız. "

PHP'de maksimum fonksiyon yuvalama seviyesini arttırmanın bir yolu var mı


113
2017-12-28 12:46


Menşei


Ayrıca: PHP'nin iç içe geçmiş işlev çağrıları için bir sınırı yok, bunun nedenini kullandığınız bir uzantı olmalı. - Abel
@Abel Kodumda hata bulunmadığından eminım. Her bir yinelemeli çağrıda değerini birer birer artıran statik bir değişken vardır. Bu değişkenin 100'den az olması durumunda, değişkenler 100'e ulaşıncaya kadar özyinelemeli çağrılar devam eder. Yani 100'e ulaşan değişkenin aslında temel durum olduğunu söylemek istiyorum. Hata 100 tekrardan önce ortaya çıkar. Ve bazı uzantıların buna neden olabileceğinden bahsettiğiniz gibi, simple_html_dom.php işlevlerini kullandığımı belirtmek isterim. Simple_html_dom.php hakkında herhangi bir fikriniz varsa, lütfen bu konuda bana yardımcı olun. Lütfen güncellenmiş soruya bakın. - Rafay
Bu xdebug tarafından bir hatadır. Ekran görüntüsünden, xdebug kullandığınız görünür. Buradaki ayarı devre dışı bırakabilirsiniz: xdebug.max_nesting_level veya yuvalama seviyesinin ne kadar büyük olduğunu söyleyin. - hakre
WAMP kullanırsanız, php.ini içinde xdebug işlevini devre dışı bırakmanın her zaman çalışmadığını unutmayın; aynı izin verilen yuvalama seviyesinin uzatılması için de geçerlidir; bir hata bir tahmin; ÇÖZÜM: php.ini'ye gidin ve php_xdebug - ???. - Jeffz
Olası kopya Artan yuvalama fonksiyonları sınırı arar - A.L


Cevaplar:


Php.ini dosyanızdaki xdebug.max_nesting_level değerini artırın: http://xdebug.org/docs/all_settings#max_nesting_level


129
2018-05-09 08:08



Bunu nasıl yaptığını açıklayabilir misiniz? - A.L
@ A.L php.ini dosyanızı düzenlersiniz ve XDebug bölümünde xdebug.max_nesting_level satırını ekler veya düzenlersiniz. - Maxence
Ancak, bu bir üretim ortamıysa, oradaki xdebug'u devre dışı bırakmak için kabul edilen cevaba bakın. - zkent
Bu semptomu çözer (bir süreliğine), ama problemi değil. - Sebastian Mach
MAMP üzerinde Haxe için UFront kullanırken bu çözüm benim için çalıştı. - Confidant


Basit bir çözüm benim problemimi çözdü. Sadece bu satırı yorumladım:

zend_extension = "d:/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll

benim .. De php.ini dosya. Bu uzantı, yığının 100 ben de onu devre dışı bıraktım. Yinelemeli işlev şimdi beklendiği gibi çalışıyor.


49
2017-12-29 11:41



Sonuçta, sonunda XDebug uzantısı oldu ... İyi bilmek. İki gün içinde kendi cevabınızı kabul edilebilir cevap olarak kabul edebilirsiniz, eğer isterseniz (ve önceki sorularınıza bir bakın, en çok kabul edilen cevabı kaçırmayın). - Abel
Aşırı özyineleme ile uğraşmak, sadece izlemeyi kapatmaktan daha iyidir. - petesiss
Bu ağır bir yaklaşım. Maksimum yığın derinliğini ayarlamak için değişkenden bahseden yukarıdaki cevaplar daha iyi bir yaklaşımdır. - aredridel
Bir üretim ortamında xdebug etkin olmadı. - HarryFink
Bu çözüm çok zor, eğer Xdebug'a kaynak kodunu ayıklamak için iyi bir seçenek değil. Sadece bir test olmadıkça bu çözüm önerilmemektedir - vandersondf


Yinelemeli fonksiyon çağrıları yerine, yapıyı düzleştirmek için bir kuyruk modeli ile çalışın.

$queue = array('http://example.com/first/url');
while (count($queue)) {
    $url = array_shift($queue);

    $queue = array_merge($queue, find_urls($url));
}

function find_urls($url)
{
    $urls = array();

    // Some logic filling the variable

    return $urls;
}

Bunu halletmenin farklı yolları var. Taşınan kaynak veya yollar hakkında biraz bilgi sahibi olmanız durumunda daha fazla bilgi edinebilirsiniz. Benzer bir model üzerinde çalışabilen dağıtılmış kuyruklar da vardır.


42
2017-12-28 13:18



SPL ile sırayı yeniden keşfetmeniz gerekmez: php.net/manual/en/class.splqueue.php - Francesco
SPL Sırası biraz daha hız sağlayabilir, ancak çoğu basit görev için dizilere yapışmayı seviyorum. push / pop / shift / unshift hepsi sağlanmıştır. - Louis-Philippe Huberdeau
Bu doğru cevap. Değişikliği varsayılan değerlerden kaçının. Kodunuzu optimize etmeye çalışın. - Junaid Atique


Başka bir çözüm eklemek xdebug.max_nesting_level = 200 php.ini'nizde


37
2018-06-25 11:50



Benim için çalıştım .. - Praneeth Nilanga Peiris
Ayrıca, projenizin yapılandırma dosyasında, örneğin php'de yapmak da mümkündür. ini_set('xdebug.max_nesting_level', 200); - svassr
Bu düzeltme benim için çalıştı, ama bu neden oluyor? - htxryan
@htxryan Uzman değilim, ancak çağrı yığınının çok "derin" olmasından kaynaklanıyor (diğer işlevleri çağırmak için çok fazla işlev var). Bunun meydana geldiği tipik senaryo, özyinelemeli bir işlevdir. Ayar, koddaki bir hata nedeniyle "kontrol dışı" yinelemeden kaçınmak için en muhtemeldir. - Bryan
@svassr bu ipucu ayrı bir cevap olarak eklemek veya mevcut birine eklemek düşünebilirsiniz, bu bana yardımcı oldu ama neredeyse yorumlarda cevapsız - Bryan


Xdebug'u devre dışı bırakmak yerine,

xdebug.max_nesting_level = 500


23
2018-03-13 15:59



Bu cevap yıllar önce verilmemiş miydi? - Sebastian Mach
@SebastianMach: ve inanılmaz bir şekilde, yıllar sonra. :) (Gibi dört kez daha, vb. İnsanlar sadece şimdi okumaz, daha fazla kaydırma yapmazlar.) - Sz.
@S .: Wow, geçmişten ne bir patlama: P Şaşırtıcı derecede şok edici. - Sebastian Mach


Bunu doğrudan php'de, örneğin projenizin yapılandırma dosyasında düzeltmek de mümkündür.

ini_set('xdebug.max_nesting_level', 200);


15
2017-10-19 15:08



Teşekkürler, bu benim tüm dev kutular üzerinde php.ini güncelleme hakkında endişelenmenize gerek yok gibi güzel çalışır, ben sadece bu uygulamanın benim bootstrap dosyasına ekleyin. - Bryan


Muhtemelen xdebug yüzünden oldu.

Aşağıdaki satırı yorumlamaya çalışın. "Php.ini" ve PHP'yi yeniden yüklemek için sunucunuzu yeniden başlatın.

";xdebug.max_nesting_level"


12
2017-07-25 01:32



ya da tüm xdebug - zloctb
Bu nasıl çalışır? Sınırı manuel olarak tanımlamazsanız, yalnızca varsayılan değerine döner, bu da 100'dür (xdebug.org/docs/basic). Bu satırı yorumlayarak yaptığınız tek şey, ayarı varsayılana döndürmeye zorlar. - justanotherprogrammer
Aracı kullanmasına bağlı olarak tüm xdebug'leri devre dışı bırakmanız önerilmez; Normalde "xdebug.max_nesting_level" ifadesi gerçek kullanımını bilmeden kullanılır, dolayısıyla genellikle yalnızca yorum yeterli ve geçerlidir. - vandersondf


Xdebug.ini adlı bir dosya olup olmadığını görmek için /etc/php5/conf.d/ adresini deneyin.

max_nesting_level varsayılan olarak 100'dür

Bu dosyada ayarlanmamışsa şunları ekleyin:

xdebug.max_nesting_level=300

listenin sonuna kadar öyle görünüyor

xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=/home/drupalpro/websites/logs/profiler
xdebug.max_nesting_level=300

daha sonra kullanabilirsiniz @ Andrey adlı çalışıp çalışmadığınızı görmek için bu değişikliği yapmadan önce ve sonra test edin.

php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'

12
2018-03-06 17:35



Harika, xdebug'un ayrı olduğunu belirten ilk cevap .ini dosya. Php5-fpm çalıştırdığınızda bu dosya muhtemelen burada bir yerdedir: /etc/php5/fpm/conf.d/20-xdebug.ini - Daan