我遇到的问题很奇怪。 在执行递归循环时会发生这种情况。 使用for循环或任何其他迭代执行相同任务时,不会发生这种情况。

在?21 000次以下递归调用函数时,一切正常。 超过此数字时会出现问题。

我的工作代码:

foo();

function foo($i = 1) {

if ($i > 20000) {

return;

}

echo $i . '
';

foo($i + 1);

return;

}

输出:... 199981999920000

不起作用的代码:

foo();

function foo($i = 1) {

if ($i > 30000) {  // Or any number above ~21000

return;

}

echo $i . '
';

foo($i + 1);

return;

}

输出:... 134931349413最后一行在数字中间停止。

在某些情况下,它只是向服务器发送一个空响应。

我正在PHP版本5.6.10的Ubuntu上使用apache2服务器。 使用Xampp时,会发生相同的问题,只是数字略有不同。

听起来像是内存问题。尝试更改最大内存设置,重新启动Apache,然后再次运行代码。

在现实生活中是否需要30K递归调用?听起来像简单的循环确实可以在这里更有效地解决问题。

每个脚本允许使用多少内存?我认为默认值为128,因此您可能需要将其更改为256甚至更高。检查您的PHP ini是否有" memory_limit"

增加xdebug.max_nesting_level。在此处检查答案stackoverflow.com/questions/17488505/

那执行时间呢?还是输出缓冲区?

调用堆栈也有限制

@kdlcruz我现在没有xdebug,所以不能成为问题

在将memory_limit设置为64M的情况下,我进入了278518。执行时间小于2秒。您是否尝试过使用error_reporting = E_ALL并观看error.log文件? (用于复制:哪个版本的ubuntu?)

@ frz3993 20000个循环的执行时间约为0.02秒。我认为那不是最糟糕的

@VolkerK Ubuntu版本是14.04.2 LTS。 Havent看了我的error.log。现在要做。

出于安全考虑:我的意思是在php.ini中由error_log=....指令指定的文件;-)

@VolkerK检查了error_log=...指定的我的文件,但其中没有任何相关内容。

我怀疑它停止在上述数字中间,仅打印13的原因是因为当您的代码以过多的递归溢出堆栈时,其余输出已被缓冲并且从未发送过。尝试在echo语句之后添加ob_flush()以获取完整的输出。

在大多数当前流行的编程语言(包括PHP)中,函数可以执行多少递归是有限制的。这不是硬性限制;根据程序的状态,可以递归调用数以万计的深度,也可以仅数个深度。因此,实现像示例这样的深度递归函数并不安全,并且程序将崩溃。请参阅PHP用户定义函数文档底部的注释:

Recursive function/method calls with over 100–200 recursion levels can smash the stack and cause a termination of the current script.

每次调用函数时,程序必须在开始执行该函数之前记录执行的位置,因此它知道在函数返回后再次从何处开始执行。存储此信息的空间非常有限,因此,如果您同时有太多的函数调用,它将耗尽空间,并且程序将崩溃。此信息以及大量其他信息都存储在堆栈中,当堆栈中的空间用完时,这称为堆栈溢出或粉碎堆栈。

某些语言实现了称为尾部调用优化的功能,该功能允许在适当的情况下进行无限递归。功能语言通常支持此功能,例如Scheme和ML。但是,如PHP是否优化尾部递归?中所述,PHP不能。

php暂停循环,在特定数量的递归循环后,PHP停止执行相关推荐

  1. 不定数量的多重循环简单实现

    不定数量的多重循环简单实现 要点概览 目的 实现不定数量的多重(层)循环 循环层数可以是1到n 不同层的循环数可以是不同的 运行环境 windows系统:64位win7 fotran编译器:mingw ...

  2. 递归循环子组件_算法一看就懂之「 递归 」

    之前的文章咱们已经聊过了 「 数组和链表 」 . 「 堆栈 」 和 「 队列 」 ,今天咱们来看看「 递归 」,当然「 递归 」并不是一种数据结构,它是很多算法都使用的一种编程方法.它太普遍了,并且用 ...

  3. 递归循环一个无限极数组_理解递归、尾调用优化和蹦床函数优化

    想要理解递归,您必须先理解递归.开个玩笑罢了, 递归 是一种编程技巧,它可以让函数在不使用 for 或 while 的情况下,使用一个调用自身的函数来实现循环. 例子 1:整数总和 例如,假设我们想要 ...

  4. php 递归栏目名叠加,thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归...

    thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归 本文实例讲述了thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法.分享给大家供大家参考,具体如下: 这 ...

  5. 递归找到节点后跳出递归循环

    递归找到节点后跳出递归循环 在js 的递归循环中,找到了节点想跳出递归循环,如果是单纯的return或者break的时候,并没有阻止递归的循环 // 造一个树数据 const treeList = [ ...

  6. java跳出递归_在Java项目中如何跳出递归循环

    在Java项目中如何跳出递归循环 发布时间:2020-11-25 17:16:07 来源:亿速云 阅读:114 作者:Leah 今天就跟大家聊聊有关在Java项目中如何跳出递归循环,可能很多人都不太了 ...

  7. javaScript使用递归循环遍历多层级对象方法(无限不定数层级)

    1.需求 在做一个Echarts关系图项目的时候碰到一个需求,后端传过来的数据格式是这样子的: "data":{name:"小明",relation:nullc ...

  8. python setattr无限递归_如何避免使用setattr和属性setter来避免递归循环?

    在调用setattr时,当试图设置某个带有setter的属性的值时,这将导致无限递归循环:class TypeSystem(object): def __setattr__(self, key, va ...

  9. python循环语句-python语句中Python循环语句(附代码)

    python语句多如牛毛,对于很多初学者来说,不知道该如何下手.今天本文将着重讲述python语句中for语句和while语句.都知道这2种语句都属于循环语句,for语句属于遍历循环,while语句属 ...

最新文章

  1. 【点云论文速读】最佳点云分割分析
  2. pitch android,Pitch Clash
  3. 编写代码的若干个基本规则(以Java为例)
  4. 可变数组NSMutableArray
  5. docker的镜像创建与Dockefile的编写
  6. Java面试之synchronized和Lock有什么区别?
  7. Redis学习---Redis操作之String
  8. 字节跳动高工面试:mysql主从复制延迟
  9. 白萝卜梨汤止咳防感冒
  10. git/SmartGit切换用户
  11. 孪生再世代表数字几_能科股份:智能制造需求旺盛,中标多领域数字孪生项目
  12. python清空字典保留变量_python中字典删除元素
  13. 项目管理第六章项目进度管理
  14. PDF不小心删掉了怎么恢复?4个方法隔壁家老王已经恢复了
  15. 如何用python打开qq_如何用python登录qq
  16. vue el-descriptions 样式问题
  17. 《雅舍谈吃》读书笔记
  18. SAP中新增移动类型科目确定配置处理实例
  19. 如何考上复旦大学研究生
  20. Cloudera Manager环境搭建【二】

热门文章

  1. python 对象_Python中的Barrier对象
  2. bbb u-boot 验证 emmc
  3. U-BOOT之一:BootLoader 的概念与功能
  4. 解决VC不包含stdint.h头文件问题
  5. 实例解析linux内核I2C体系结构(1)
  6. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...
  7. 【转】tftp命令详解
  8. 【转】Ubuntu 16.04 Nvidia驱动安装(run方式)
  9. 天猫方糖 篇一:新版天猫放糖改造立体声
  10. java并发锁获取的方式_Java精通并发-notify方法详解及线程获取锁的方式分析