Saya telah membuat fungsi yang menemukan semua URL dalam file html dan mengulangi proses yang sama untuk setiap konten html yang ditautkan ke URL yang ditemukan. Fungsinya rekursif dan dapat berjalan tanpa henti. Namun, saya telah membatasi rekursi dengan menetapkan variabel global yang menyebabkan rekursi berhenti setelah 100 rekursi.
Namun, php mengembalikan kesalahan ini:
Kesalahan fatal: Tingkat penyarangan fungsi maksimum '100' tercapai, dibatalkan! di D: \ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php di baris 1355
Saya menemukan solusi di sini: Meningkatkan batas panggilan fungsi bersarang tetapi ini tidak berfungsi dalam kasus saya.
Saya mengutip salah satu jawaban dari tautan yang disebutkan di atas. Mohon pertimbangkan itu.
"Apakah Anda menginstal Zend, IonCube, atau xDebug? Jika demikian, mungkin dari situlah Anda mendapatkan kesalahan ini.
Saya mengalami ini beberapa tahun yang lalu, dan akhirnya Zend menempatkan batasan itu di sana, bukan PHP. Tentu saja menghapusnya akan membuat> Anda melewati 100 iterasi, tetapi pada akhirnya Anda akan mencapai batas memori. "
Apakah ada cara untuk meningkatkan level bersarang fungsi maksimum di PHP
Jawaban:
Tingkatkan nilai
xdebug.max_nesting_level
dalam Andaphp.ini
sumber
xdebug.max_nesting_level = -1
Solusi sederhana memecahkan masalah saya. Saya baru saja mengomentari baris ini:
zend_extension = "d:/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll
di
php.ini
file saya . Ekstensi ini membatasi tumpukan100
jadi saya menonaktifkannya. Fungsi rekursif sekarang bekerja seperti yang diantisipasi.sumber
Daripada melakukan panggilan fungsi rekursif, gunakan model antrian untuk meratakan struktur.
$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; }
Ada berbagai cara untuk menanganinya. Anda dapat melacak lebih banyak informasi jika Anda membutuhkan beberapa wawasan tentang asal atau jalur yang dilalui. Ada juga antrian terdistribusi yang dapat bekerja dengan model serupa.
sumber
Solusi lain adalah menambahkan
xdebug.max_nesting_level = 200
php.ini Andasumber
ini_set('xdebug.max_nesting_level', 200);
Daripada menonaktifkan xdebug, Anda dapat mengatur batas yang lebih tinggi seperti
sumber
Anda juga dapat memperbaikinya secara langsung di php, misalnya di file konfigurasi proyek Anda.
ini_set('xdebug.max_nesting_level', 200);
sumber
Masuk ke file konfigurasi php.ini Anda dan ubah baris berikut:
xdebug.max_nesting_level=100
menjadi sesuatu seperti:
xdebug.max_nesting_level=200
sumber
di Ubuntu menggunakan PHP 5.59:
harus `:
dan temukan xdebug.ini Anda di direktori itu, dalam kasus saya adalah 20-xdebug.ini
dan tambahkan baris ini '
atau ini
atur ke -1 dan Anda tidak perlu khawatir mengubah nilai level bersarang.
`
sumber
mungkin terjadi karena xdebug.
Coba beri komentar pada baris berikut di "php.ini" Anda dan mulai ulang server Anda untuk memuat ulang PHP.
";xdebug.max_nesting_level"
sumber
Coba cari di /etc/php5/conf.d/ untuk melihat apakah ada file bernama xdebug.ini
max_nesting_level adalah 100 secara default
Jika tidak diatur dalam file itu tambahkan:
xdebug.max_nesting_level=300
ke akhir daftar sehingga terlihat seperti ini
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
Anda kemudian dapat menggunakan pengujian @ Andrey sebelum dan sesudah melakukan perubahan ini untuk melihat apakah berhasil.
php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'
sumber
.ini
file terpisah . Omong-omong, ketika Anda menjalankan php5-fpm, file ini mungkin ada di suatu tempat di sini:/etc/php5/fpm/conf.d/20-xdebug.ini
php.ini:
Saya tidak sepenuhnya yakin apakah nilainya akan meluap dan mencapai -1, tetapi nilainya tidak akan pernah mencapai -1, atau akan menetapkan max_nesting_level cukup tinggi.
sumber
Anda dapat mengubah kode rekursif Anda menjadi kode iteratif, yang mensimulasikan rekursi. Ini berarti Anda harus mendorong status saat ini (url, dokumen, posisi dalam dokumen, dll.) Ke dalam array, ketika Anda mencapai tautan, dan mengeluarkannya dari larik, ketika tautan ini telah selesai.
sumber
Anda dapat mencoba menggoyahkan penyarangan dengan menerapkan pekerja paralel (seperti dalam komputasi cluster) alih-alih meningkatkan jumlah panggilan fungsi bersarang.
Misalnya: Anda menentukan slot dalam jumlah terbatas (mis. 100) dan memantau jumlah "pekerja" yang ditugaskan untuk masing-masing / beberapa di antaranya. Jika ada slot yang menjadi kosong, Anda menempatkan pekerja yang menunggu "di dalamnya".
sumber
Periksa rekursi dari baris perintah:
php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'
jika hasil> 100 MAKA periksa batas memori;
sumber
Jika Anda menggunakan Laravel, lakukan
Ini harusnya berhasil.
sumber
<?php ini_set('xdebug.max_nesting_level', 9999); ... your code ...
PS Ubah 9999 ke nomor yang Anda inginkan.
sumber
Saya mengalami kesalahan ketika saya menginstal banyak plugin Jadi kesalahan 100 muncul termasuk lokasi plugin terakhir yang saya instal C: \ wamp \ www \ mysite \ wp-content \ plugins \ "..." jadi saya menghapus plugin ini folder di drive C: maka semuanya kembali normal.Saya pikir saya harus membatasi jumlah plug-in yang saya instal atau yang telah diaktifkan. semoga berhasil saya harap ini membantu
sumber
Dalam kasus Anda, sudah pasti instance crawler memiliki lebih banyak batas Xdebug untuk melacak info kesalahan dan debug.
Tetapi, dalam kasus lain juga kesalahan seperti pada PHP atau file inti seperti pustaka CodeIgniter akan membuat kasus seperti itu dan jika Anda bahkan meningkatkan pengaturan level x-debug, itu tidak akan hilang.
Jadi, perhatikan kode Anda dengan cermat :).
Inilah masalah dalam kasus saya.
Saya memiliki kelas layanan yang merupakan perpustakaan di CodeIgniter. Memiliki fungsi didalamnya seperti ini.
class PaymentService { private $CI; public function __construct() { $this->CI =& get_instance(); } public function process(){ //lots of Ci referencing here... }
Pengontrol saya sebagai berikut:
$this->load->library('PaymentService'); $this->process_(); // see I got this wrong instead it shoud be like
Pemanggilan fungsi pada baris terakhir salah karena salah ketik, mestinya seperti di bawah ini:
$this->Payment_service->process(); //the library class name
Kemudian saya terus mendapatkan pesan kesalahan melebihi. Tapi saya menonaktifkan XDebug tetapi tidak membantu. Dengan cara apa pun, silakan periksa nama kelas atau kode Anda untuk panggilan fungsi yang tepat.
sumber
Saya mengalami masalah ini dengan WordPress di cloud9. Ternyata itu adalah plugin W3 Caching. Saya menonaktifkan plugin dan berfungsi dengan baik.
sumber
Solusi lain jika Anda menjalankan skrip php di CLI (cmd)
File php.ini yang perlu diedit berbeda dalam kasus ini. Dalam instalasi WAMP saya, file php.ini yang dimuat di baris perintah adalah:
\wamp\bin\php\php5.5.12\php.ini
bukannya \ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini yang dimuat ketika php dijalankan dari browser
sumber
Anda juga dapat memodifikasi fungsi {debug} di modifier.debug_print_var.php, untuk membatasi rekursi menjadi objek.
Sekitar baris 45, sebelumnya:
$results .= '<br>' . str_repeat(' ', $depth * 2) . '<b> ->' . strtr($curr_key, $_replace) . '</b> = ' . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
Sesudah:
$max_depth = 10; $results .= '<br>' . str_repeat(' ', $depth * 2) . '<b> ->' . strtr($curr_key, $_replace) . '</b> = ' . ($depth > $max_depth ? 'Max recursion depth:'.(++$depth) : smarty_modifier_debug_print_var($curr_val, ++$depth, $length));
Dengan cara ini, Xdebug masih akan berperilaku normal: membatasi kedalaman rekursi di var_dump dan seterusnya. Karena ini adalah masalah yang cerdas, bukan masalah Xdebug!
sumber
Saya memiliki masalah yang sama dan saya kembali seperti ini:
Buka file MySQL my.ini
Di bagian [mysqld], tambahkan baris berikut: innodb_force_recovery = 1
Simpan file dan coba mulai MySQL
Hapus baris yang baru saja Anda tambahkan dan Simpan
sumber