Meningkatkan batas panggilan fungsi bersarang

127

Ada satu batasan yang sangat buruk di PHP: jika Anda memanggil beberapa fungsi a1 () yang memanggil a2 (), yang memanggil a3 ... jadi ketika a99()akan memanggil a100()Anda akan melihat

Kesalahan fatal: Level maksimal fungsi bersarang '100' tercapai, batal!

Apakah ada cara untuk meningkatkan batas 100 panggilan bersarang menjadi 500 atau 10.000?

Ini penting bagi saya karena saya sedang mengembangkan sistem berbasis acara dengan banyak panggilan balik.

barbushin
sumber
12
100 tampaknya sedikit berlebihan, bahkan untuk kerangka acara.
Ignacio Vazquez-Abrams
7
@Ignacio: cukup sederhana, bahkan jika fokusnya adalah pada kerangka acara, untuk memiliki fungsi rekursif yang membutuhkan tingkat bersarang yang jauh lebih tinggi. Puluhan ribu (atau bahkan jutaan) tidak jarang dalam skenario seperti itu.
Abel
stackoverflow.com/a/36440027/2652524 Saya memecahkan masalah saya menggunakan jawaban ini
Gujarat Santana

Jawaban:

254

Pesan kesalahan ini datang khusus dari ekstensi XDebug. PHP sendiri tidak memiliki batas fungsi nesting. Ubah pengaturan di php.ini Anda:

xdebug.max_nesting_level = 200

atau dalam kode PHP Anda:

ini_set('xdebug.max_nesting_level', 200);

Adapun jika Anda benar-benar perlu mengubahnya (yaitu: jika ada solusi alternatif untuk fungsi rekursif), saya tidak bisa mengatakannya tanpa kode.

netcoder
sumber
Saya memiliki masalah yang sama. Max_nesting_level saya diatur ke 100 tetapi dalam kasus saya, dalam beberapa kasus, dimungkinkan untuk memiliki 1000 panggilan rekursif. Jadi, saya set ke 10000 untuk menghindari kesalahan xdebug ini. Dalam semua kasus, selalu lebih baik daripada membiarkan PHP tanpa batas.
SkaJess
9
Jika Anda tidak memiliki xdebug.max_nesting_level = 100opsi ini di php.ini, cukup tempelkan di.
M. Reza Nasirloo
@Pedram Cara yang benar untuk menyalin bahwa dalam file php ini adalah di /etc/php5/apache2/conf.d/20-xdebug.ini, bukan di php.ini normal. Latihan yang bagus
Enrique Quero
3
@ EnriqueQuero Tergantung pada sistem dan OS.
netcoder
Berhasil! Tidak masalah jika Anda menggunakan XDebug atau tidak, tidak juga jika Anda berkomentar di php.ini. Saya secara eksplisit menggunakan: ini_set ('xdebug.max_nesting_level', -1);
user2928048
13

Apakah Anda sudah menginstal Zend, IonCube, atau xDebug? Jika demikian, dari situlah Anda mendapatkan kesalahan ini.

Saya mengalami ini beberapa tahun yang lalu, dan akhirnya menjadi Zend menetapkan batas itu, bukan PHP. Tentu saja menghapusnya akan membiarkan Anda melewati 100 iterasi, tetapi Anda akhirnya akan mencapai batas memori.

Ryan C -Xnuiem- Meinzer
sumber
1

Secara pribadi saya akan menyarankan ini adalah kesalahan yang bertentangan dengan pengaturan yang perlu disesuaikan. Dalam kode saya itu karena saya memiliki kelas yang memiliki nama yang sama dengan perpustakaan di dalam salah satu pengendali saya dan sepertinya membuatnya tersandung.

Keluarkan kesalahan dan lihat di mana ini dipicu.

Antony
sumber