为什么 PHP 中的无限递归函数会导致段错误?

2023-12-27

一个假设性的问题供大家思考...

我最近回答了另一个关于 PHP 脚本出现段错误的问题,它让我想起了我一直想知道的事情,所以让我们看看是否有人可以阐明它。

考虑以下:

<?php

  function segfault ($i = 1) {
    echo "$i\n";
    segfault($i + 1);
  }

  segfault();

?>

显然,这个(无用的)函数无限循环。最终,将耗尽内存,因为对该函数的每次调用都会在前一个调用完成之前执行。有点像没有分叉的叉子炸弹。

但是......最终,在 POSIX 平台上,脚本将因 SIGSEGV 而终止(它也会在 Windows 上终止,但更优雅 - 就我极其有限的低级调试技能而言)。循环数量取决于系统配置(分配给 PHP、32 位/64 位等的内存)和操作系统,但我真正的问题是 - 为什么会发生段错误?

  • 这就是 PHP 处理“内存不足”错误的方式吗?当然必须有一种更优雅的方式来处理这个问题吗?
  • 这是 Zend 引擎中的错误吗?
  • 有什么方法可以在 PHP 脚本中更优雅地控制或处理这个问题吗?
  • 是否有任何设置通常控制函数中可以进行的最大递归调用次数?

如果使用 XDebug,则存在最大函数嵌套深度,该深度由ini设置 http://xdebug.org/docs/all_settings#max_nesting_level:

$foo = function() use (&$foo) { 
    $foo();
};
$foo();

产生以下错误:

致命错误:已达到最大函数嵌套级别“100”,正在中止!

恕我直言,这是比段错误更好的选择,因为它只杀死当前脚本,而不是整个过程。

这是几年前(2006 年)的内部清单。他的评论是:

到目前为止,还没有人提出无限循环问题的解决方案 将满足这些条件:

  1. 没有误报(即好的代码总是有效)
  2. 执行速度不会减慢
  3. 适用于任何堆栈大小

因此,这个问题仍然没有解决。

现在,#1 实际上是不可能解决的,因为停止问题 http://en.wikipedia.org/wiki/Halting_problem。如果您保留堆栈深度的计数器,#2 就很简单了(因为您只是检查堆栈推送时递增的堆栈级别)。

最后,#3 是一个更难解决的问题。考虑到某些操作系统将以非连续的方式分配堆栈空间,不可能以 100% 的准确度实现,因为不可能可移植地获取堆栈大小或使用情况(对于特定平台,可能或甚至很容易,但一般而言并非如此)。

相反,PHP 应该从 XDebug 和其他语言(Python 等)获取提示并创建可配置的嵌套级别(Python 是set to http://docs.python.org/library/sys.html#sys.setrecursionlimit默认1000)....

或者,或者捕获堆栈上的内存分配错误,以在发生之前检查段错误并将其转换为RecursionLimitException以便您能够康复......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 PHP 中的无限递归函数会导致段错误? 的相关文章

  • 检查php中位字段是否打开的正确方法是什么

    检查位字段是否打开的正确方法是什么 在 php 中 我想检查来自 db mysql 的位字段是否打开 这是正确的方法吗 if bit 1 还有其他方法吗 我看到有人使用代码ord http jameslow com 2008 08 12 m
  • 删除PHP字符串中所有不匹配的字符?

    我有一个文本 我想从中删除所有不属于以下字符的字符 所需字符 0123456789 abcdefghijklmnopqrstuvwxyz n 最后一个是我确实想保留的 n 换行符 要匹配除列出的字符之外的所有字符 请使用反转字符集 http
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • 如何解压 PHP/Lumen/Laravel 的 gzip 请求?

    我收到来自第三方的 gzip 编码文本请求 1mb 所以这是有道理的 我的测试路线 router gt post testgzip function Illuminate Http Request request decompressed
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  •  
    标记内删除

    我制作了简单的 BBCode 脚本 一切正常 但后来我使用了一个 javascript 库来美化我的代码 pre pre 现在我面临的唯一问题是 br 每行代码后面的标签 pre pre tags 所以问题是我怎样才能删除 br 标记哪些在
  • FPDI/FPDF:水印和打印多页

    我修改了这个堆栈问题 当用户尝试下载文件时在 pdf 文件上应用水印 https stackoverflow com questions 3983432 applying watermarks on pdf files when users
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 蛋糕控制台 2.2.1:烘焙错误

    运行 MAMP 的 OSX 机器 CakePHP 2 2 1 已正确安装和配置 这意味着当我浏览到 Index php 文件时 所有绿色条都显示出来 我已经完成了博客教程 并且正在开发我的第二个应用程序 其中脚手架已启动并运行 现在我第一次
  • 如何在原则 2 迁移中删除外键

    我想在原则 2 迁移中删除外键 但没有 dropForeignKeyConstraint 有谁知道怎么丢掉吗 public function down Schema schema table schema gt getTable table
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • PHP preg_filter 返回意外的长值

    尝试在 Woocommerce 中删除标签并过滤值 但无法以正确的格式获取它 有东西有腥味 我正在使用WC gt cart gt get cart subtotal 来检索该值 在此示例中 我的值是 2 429kr 原始返回值是 span
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • MySQL - 长文本搜索

    我相信这个问题对于很多像我一样的MySQL新手来说会有用 有什么方法可以搜索 LONGTEXT 类型吗 正如我所见 FULLTEXT 只能用于 TEXT 字段 由于大小的原因 这不适合我 附 我听说 LONGTEXT 存储为 BLOB 因此
  • 正则表达式:匹配以某些字母开头的一定长度的单词

    我需要一个匹配的正则表达式7字母词 开头为 st 例如 它应该只匹配 startin 来自以下 start startin starting 一般提示 起始符号直接包含在正则表达式中 例如st 如果起始字符在正则表达式语法意义上是特殊的 如
  • 从我的字符串生成器中删除一个字符[重复]

    这个问题在这里已经有答案了 我有以下字符串生成器作为 msrtResult 它很长 mstrResult Append rtbResult Text Append Environment NewLine 现在如何从 mstrResult 中
  • Codeigniter 3 分页类与 bootstrap 4

    Codeigniter 3 与 Bootstrap 4 兼容吗 或者它是否已经过时 无法为 bootstrap 4 添加任何用途 我一直在网上查看有关如何将引导程序集成到 Codeigniter 分页的教程 到目前为止我所看到的是他们主要改
  • 从 CQRS 访问 Web 服务

    假设我有一个基于 CQRS 的系统 并且我的域需要来自外部 Web 服务的一些数据来做出决策 我如何正确建模 我可以想到两个选择 命令处理程序运行域逻辑 域本身调用 Web 服务 一旦获得响应 它将适当的事件附加到当前聚合并存储它们 该域基
  • 达到限制后停止拖动

    我正在使用反应本机手势处理程序来创建一个可以上下滚动的栏 目前我可以随心所欲地滚动它 我想修改它 以便在达到特定限制时它应该停止滚动 export const SwipeablePanel React FunctionalComponent
  • Monotouch - ICSharpCode.SharpZipLib 出现错误

    嘿伙计们 我正在尝试使用 ICSharpCode SharpZipLib 库生成 Zip 文件 但它抛出了一个非常奇怪的错误 Code public static void ZipFiles string inputFolderPath s
  • mongoengine.fields.ImproperlyConfigured:未找到 PIL 库

    当我尝试导入具有 ImageField 的 MongoEngine 类时 出现错误 mongoengine fields ImproperlyConfigured PIL library was not found 我的班级结构是这样的 c
  • 如何检查 iOS 键盘是否启用听写功能?

    我必须显示一张图像 突出显示 iOS 键盘中的麦克风图标 上面写着 点击此处发言 但如果在键盘设置中禁用听写 则不会显示麦克风图标 我的目的是检查启动应用程序时是否启用听写 如果没有 我想显示从 设置 gt 键盘 gt 启用听写 启用听写的
  • 在 Android Studio 中哪里可以找到有关过时 API 的调试信息?

    在 AS 3 3 版本中 我们现在可以设置gradle properties归档android debug obsoleteApi true标志 它允许我们查看不再支持的 API 调用 根据这篇文章在 AS 博客上 https androi
  • 循环不同的值

    给定一个使用 unique values 函数返回不同状态列表的变量 是否有一种方法可以在 for each 循环中标记该变量
  • 表达:req.query和req.body有什么区别

    我想知道 req query 和 req body 有什么区别 下面是一段代码 其中req query用来 如果我使用会发生什么req body代替req query 下面的函数被调用的结果是 resource获取函数 该函数检查用户是否经
  • 为什么我似乎可以在 return 语句中复制 std::unique_ptr ? [复制]

    这个问题在这里已经有答案了 可能的重复 从函数返回 unique ptr https stackoverflow com questions 4316727 returning unique ptr from functions 20 7
  • PHP - 设置继承的静态属性也会在继承它的其他类中设置它

    我有一个代表 html 元素的类层次结构 其中一些可能与某些浏览器版本不兼容 例如 HTML5 画布与版本 9 之前的 Internet Explorer 不兼容 我希望对于每种类型的元素 能够知道调用浏览器是否支持它们 abstract
  • ADB 在 Ubuntu 上未检测到我的 Android 设备

    需要帮忙 adb 检测不到我的手机 我不知道该怎么办 这就是我所做的 如果我有错误或有什么问题请告诉我 我以 root 身份登录并创建此文件 etc udev rules d 51 android rules 这些是我的手机规则LG L80
  • 如何使用索引属性转换时间序列 pandas 数据框?

    给定一个具有时间序列的数据框 如下所示 Close 2015 02 20 14 00 00 1200 1 2015 02 20 14 10 00 1199 8 2015 02 21 14 00 00 1199 3 2015 02 21 14
  • 不支持采样 flex/actionscript

    在我需要的动作脚本中 Loading configuration file opt flex frameworks flex config xml t3 mxml 10 Error unsupported sampling rate 240
  • Owin获取查询字符串参数

    我正在尝试从 Owin 请求获取查询字符串参数 参数 test 的获取操作仍然为空 尽管此参数位于查询字符串中 如何从 OWIN 主机读取请求参数 Call localhost 5000 test firsttest Code public
  • 将数组从 C# 传递到 C++ 时出现问题

    我有一个应用程序 需要将数组从 C 传递到 C DLL 最好的方法是什么 我在互联网上进行了一些搜索 发现我需要使用 ref 从 C 传递数组 相同的代码 status IterateCL ref input ref output 输入和输
  • 为什么 PHP 中的无限递归函数会导致段错误?

    一个假设性的问题供大家思考 我最近回答了另一个关于 PHP 脚本出现段错误的问题 它让我想起了我一直想知道的事情 所以让我们看看是否有人可以阐明它 考虑以下 显然 这个 无用的 函数无限循环 最终 将耗尽内存 因为对该函数的每次调用都会在前