解决scheme“致命错误:最大function嵌套级别达到100,中止!”在PHP中
我已经做了一个function,find一个HTML文件中的所有url,并重复每个链接到发现的url的HTML内容相同的过程。 这个函数是recursion的,可以继续下去。 但是,我已经通过设置一个全局variables来限制recursion,导致recursion在100次recursion之后停止。
但是,PHP返回这个错误:
致命错误:达到“100”的最大function嵌套级别,正在中止! 在1355行D:\ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php
我在这里find了一个解决scheme: 增加嵌套函数调用限制,但这不适用于我的情况。
我引用上面提到的链接中的一个答案。 请考虑一下。
“您是否安装了Zend,IonCube或xDebug?如果是这样,那可能是您从这个错误中得到的。
几年前,我遇到了这个问题,最终Zend把这个限制放在那里,而不是PHP。 当然,删除它会让你超过100次迭代,但是你最终会达到内存限制。“
有没有办法来增加PHP中的最大function嵌套级别
在php.ini中增加xdebug.max_nesting_level的值: http ://xdebug.org/docs/all_settings#max_nesting_level
简单的解决scheme解决了我的问题 我刚刚评论过这一行:
zend_extension = "d:/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll
在我的php.ini
文件中。 这个扩展将堆栈限制为100
所以我禁用了它。 recursion函数现在按照预期工作。
而不是进行recursion函数调用,使用队列模型来扁平化结构。
$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; }
有不同的方法来处理它。 如果您需要关于所穿过的原点或path的一些信息,则可以跟踪更多的信息。 还有分布式队列可以解决类似的模型。
另一个解决scheme是在php.ini中添加xdebug.max_nesting_level = 200
而不是禁用xdebug,你可以设置更高的限制
xdebug.max_nesting_level = 500
也可以直接在php中解决这个问题,例如在项目的configuration文件中。
ini_set('xdebug.max_nesting_level', 200);
可能是因为xdebug而发生的。
尝试在“php.ini”中注释以下行并重新启动服务器以重新加载PHP。
";xdebug.max_nesting_level"
尝试在/etc/php5/conf.d/中查看是否有一个名为xdebug.ini的文件
max_nesting_level默认为100
如果没有在该文件中设置,请添加:
xdebug.max_nesting_level=300
到列表的末尾,所以它看起来像这样
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
你可以使用@安德烈的testing之前和之后做这个改变,看看是否工作。
php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'
进入你的php.iniconfiguration文件,并更改以下行:
xdebug.max_nesting_level=100
像这样的东西:
xdebug.max_nesting_level=200
在Ubuntu上使用PHP 5.59:
得到`:
/etc/php5/cli/conf.d
并find你的xdebug.ini在这个目录下,在我的情况下是20-xdebug.ini
并添加这一行`
xdebug.max_nesting_level = 200
或这个
xdebug.max_nesting_level = -1
将其设置为-1,您不必担心更改嵌套级别的值。
`
php.ini中:
xdebug.max_nesting_level = -1
我不完全确定这个值是否会溢出并达到-1,但是它永远不会达到-1,或者它会设置max_nesting_level非常高。
您可以尝试通过实现并行工作(例如在集群计算中)来摆动嵌套,而不是增加嵌套函数调用的数量。
例如:您定义了有限数量的插槽(例如100),并监视分配给每个/部分插槽的“工作人员”的数量。 如果有空位,你就把等待的工人“放在里面”。
你可以将你的recursion代码转换成迭代代码,它可以模拟recursion。 这意味着当你到达一个链接时,你必须将当前的状态(url,文档,文档等中的位置)推送到一个数组中,当这个链接完成时,把它从数组中popup。
从命令行检查recursion:
php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'
如果结果> 100则检查内存限制;
如果你使用Laravel,那么
composer update
这应该是工作。
当我安装很多插件时出现错误所以错误100显示包括我安装的最后一个插件的位置C:\ wamp \ www \ mysite \ wp-content \ plugins \“…”所以我删除了这个插件文件夹的C:驱动器,然后一切都恢复正常。我想我必须限制插件的数量,我安装或已激活。好运气,我希望它可以帮助
我在cloud9的WordPress上遇到了这个问题。 原来这是W3caching插件。 我禁用了插件,它工作正常。
另一个解决scheme,如果你正在CLI(CMD)运行PHP脚本
在这种情况下需要编辑的php.ini文件是不同的。 在我的WAMP安装中,在命令行中加载的php.ini文件是:
\wamp\bin\php\php5.5.12\php.ini
而不是\ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini当php从浏览器运行时加载
您还可以修改modifier.debug_print_var.php中的{debug}函数,以限制其recursion到对象中。
在45号线前,
$results .= '<br>' . str_repeat(' ', $depth * 2) . '<b> ->' . strtr($curr_key, $_replace) . '</b> = ' . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
之后:
$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));
这样,Xdebug仍然会正常运行:在var_dump中限制recursion深度,等等。 因为这是一个聪明的问题,而不是一个Xdebug!
在你的情况下,绝对是爬虫实例有更多的Xdebug限制来跟踪错误和debugging信息。
但是,在其他情况下,像PHP或CodeIgniter库等核心文件的错误也会造成这种情况,如果您甚至增加了x-debug级别设置,它也不会消失。
所以,仔细看看你的代码:)。
这是我的情况。
我有一个服务类是CodeIgniter中的库。 有这样的function。
class PaymentService { private $CI; public function __construct() { $this->CI =& get_instance(); } public function process(){ //lots of Ci referencing here... }
我的控制器如下:
$this->load->library('PaymentService'); $this->process_(); // see I got this wrong instead it shoud be like
最后一行的函数调用是错误的,因为错字,而应该像下面这样:
$this->Payment_service->process(); //the library class name
然后,我不断收到超过错误信息。 但我禁用XDebug,但没有帮助。 任何方式请检查您的类名称或您的代码进行正确的函数调用。