PHP 尝试使用 preg_match 和 preg_replace 分配 127 TB 内存和内存泄漏

2024-03-13

我想我发现了一个问题,当 unicode 字符作为分隔符或有时在正则表达式中的任何位置时,该问题似乎会在 Apache / PHP 中造成内存泄漏preg_match and preg_replace。这种情况可能会发生在更多的地方preg_*方法。

测试用例1

创建一个新的 PHP 文件test.php包含以下内容:

<?php
    preg_match( '°test°i', 'test', $matches );

测试用例2

创建一个新的 PHP 文件test.php包含以下内容:

<?php
    preg_match( '°', 'test', $matches );

The unicode character ° used as a delimiter is the degree sign. Try any other unicode character to see what happens, if you like.

Result

将文件上传到网络服务器后Apache 2.4.10 (Debian) and PHP 5.6.0-1+b1,从您最喜欢的浏览器运行它。预计会看到空白页面或一条消息,指出“无效响应”或“无法加载此页面”。

这将导致 Apache error.log(通常为 /var/log/error.log)中出现以下两行:

[Mon Dec 15 10:31:09.941622 2014] [:error] [pid 6292] [client ###.###.###.###:64413] PHP Warning:  preg_match():  in /path/to/test.php on line 2
[Mon Dec 15 10:31:09.941796 2014] [:error] [pid 6292] [client ###.###.###.###:64413] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 139979759686648 bytes) in Unknown on line 0

请注意,PHP 尝试分配的字节量刚刚超过 127 TB。

您现在需要重新启动 Apache

尝试上述脚本后运行 PHP 脚本将导致出现各种通知或致命错误,即使在根本不应该生成它们的代码中也会弹出这些通知或致命错误。例如,自动加载扩展类似乎不再正常工作,并且可能显示如下错误:

Class MyClass not found in file MyExtendingClass.php on Line 3

文件 MyExtendingClass.php 如下所示:

<?php
    class MyExtendingClass extends MyClass
    {
    }

如你看到的MyClass显然在第 2 行,即使它确实存在并且自动加载器已正确设置,PHP 也无法再找到它。

显然,不要在正则表达式中使用 unicode 字符。但是为什么 PHP 在使用某些 unicode 字符时会泄漏内存呢?这种行为有解释吗?我想知道为什么 PHP 认为它应该分配如此大量的字节。

系统信息

Apache/2.4.10 (Debian) PHP/5.6.0-1+b1 OpenSSL/1.0.1i 配置


我遇到了类似的错误,PHP 试图将略大于 127 TB 的内容加载到 RAM 中,但对我来说,它发生在脚本完成之后。

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 140683487706824 bytes) in Unknown on line 0

我使用的是 PHP 版本 5.4.39-0+deb7u2,我看到它在脚本执行后发生,因为脚本本身工作正常并且没有显示任何问题。实际上,我尝试记录脚本执行时间和 RAM 使用情况,一切都很好,直到脚本结束。

我的问题很可能与使用 dblib+freetds 组合有关,用于连接到来自 Debian 的远程 MSSQL 服务器,这是一个已知错误#64511 https://bugs.php.net/bug.php?id=64511。据报道实际上已修复,但就我而言,情况似乎并非如此。

实际上很难在这种行为中找到任何规则,但这就是我所看到的。

  • 我连接到远程MSSQL
  • 执行查询(实际上包括对存储过程的调用,然后在其之后执行 SELECT 查询)

执行后,如果我使用类似以下代码来获取结果:

$sprocResultSet = $PDOquery->fetchAll(PDO::FETCH_ASSOC);
$PDOquery->nextRowset();
$sprocExitCode = $PDOquery->fetchAll(PDO::FETCH_ASSOC);

in most在这种情况下,我会遇到奇怪的 RAM 分配错误,据说加载了 TB 字节。

当我没有在 fetchAll() 中指定获取样式时,我使用了 setFetchMode(),如下所示:

$PDOquery->setFetchMode(PDO::FETCH_ASSOC);
$sprocResultSet = $PDOquery->fetchAll();
$PDOquery->nextRowset();
$sprocExitCode = $PDOquery->fetchAll();

然后我从来没有注意到分配内存时出现同样的错误。

我确实尝试关闭游标并将 $PDOquery 变量清空,或者只是让它在脚本结束时自动关闭 - 没有任何帮助。另外,也许值得一提的是,存储过程和附加的 SELECT 查询都只返回一行数据,因此肯定不会返回大结果集。

所以...我不确定这是否对所有情况都有帮助,但如果您有与我类似的情况,请尝试提前设置 PDO 的默认获取模式。

只需添加两件事。首先,在上面的代码中,使用了 PDO 的 nextResultSet(),这也被报告为错误 - 导致内存问题:nextRowset 导致内存损坏 https://bugs.php.net/bug.php?id=67130。 其次,不使用 PDO 的 fetch(),因为无论何时使用它都会死并报告 DBLIB 错误。

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

PHP 尝试使用 preg_match 和 preg_replace 分配 127 TB 内存和内存泄漏 的相关文章

  • PHP 如何判断用户是否按下了 Enter 键或 Submit 按钮?

    我遇到的问题是我在一个表单中有多个提交输入 每个提交输入都有不同的值 我更愿意将它们保留为提交 Whenever the user presses Enter it is as though the topmost submit input
  • 通过 Ajax 加载内容时,WORDPRESS 音频播放器未加载,MediaElement.js 未应用

    我正在创建一个 WordPress 主题 当我使用 ajax 加载内容时 它不会将 MediaElements js 应用于我的音频播放器 因此不会显示音频 我认为这是因为 MediaElement js 加载了 wp footer 并且此
  • 优雅地处理没有数据的 amcharts

    我想知道我的 dataProvider 是否为空 amCharts绘制时默认为null 我怎样才能动态地处理它 var chart AmCharts makeChart chartdiv theme none type serial dat
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • 在 php 中为类自动生成 getter 和 setter 的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常创建一个包含一些私有变量的类 当设置此类的实例时 应该可以使用 getter 和 setter 填充该类的所有变量 有没有一种简单的方法可
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • 为什么我需要结束 ob_start()?

    php 文档建议我应该用 ob end flush 结束每个 ob start 我在网站的每个页面上使用一个 只是为了允许我在应用程序中的任何位置使用 firephp 日志方法 该应用程序运行良好 但我想知道是否有任何我不知道的东西可能有害
  • Symfony2 Assetic 和 Less Sourcemaps

    我不确定如何破解 assetic less 过滤器以输出源映射文件 我这里指的是LessFilterhttps github com kriswallsmith assetic blob master src Assetic Filter
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 在 PHP 中撤销 Google 访问令牌

    正如标题所示 我想以编程方式撤销授予的访问令牌 即在 PHP 中 我发现这个他们的网站 https developers google com identity protocols OAuth2WebServer tokenrevoke 但
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • PHP 与 MySQL 查询性能( if 、 函数 )

    我只看到这个artice http www onextrapixel com 2010 06 23 mysql has functions part 5 php vs mysql performance 我需要知道在这种情况下什么是最好的表
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 如何在 PHP 中从 IP 地址/国家/地区名称查找时区 ID?

    谁能告诉我 PHP 中是否有任何方法可以从 IP 地址或国家 地区名称获取时区区域 例如 亚洲 加尔各答 描述 我正在尝试根据他 她的国家 地区设置用户时区 我从他的 IP 地址获取用户所在国家 地区 但我需要该国家 地区的时区区域 例如
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array

随机推荐

  • 二维数组上的深度优先搜索

    我试图通过创建一个程序来学习 DFS 该程序可以引导我的食人魔穿过迷宫 二维数组 这类似于日常编程挑战 但我只用一个 1x1 食人魔来完成 My maze static int maze 2 1 0 0 0 0 0 0 0 0 0 0 1
  • 无效的配置对象:webpack.server.js

    我正在使用这个 webpack 文件并收到错误 这是网页包文件 const path require path module exports target node entry src index js output filename bu
  • 使用 php 从 POP3 服务器获取邮件

    我正在尝试从 POP3 获取邮件 我正在使用 POP3 邮件服务器 并且我正在尝试获取邮件内容并将其存储到我的项目的数据库表中 但我找不到任何 PHP 脚本 全部仅适用于 IMAP 您知道如何从 POP3 服务器获取邮件吗 Thanks 有
  • 如何在相对布局中以编程方式设置重力

    如何在相对布局中以编程方式设置重力 我有一个带有名称的 XML 布局chat viewer message xml如下
  • 当值 * 是 * 指定的值时,If Not 函数继续

    我正在尝试编写一个脚本来检查另一个工作表中的重复值 但我无法让它工作 在行problem如果函数always收益 是否设置为If Not or If LocationCell 不等于 Nothing 我确信这是一个明显的错误 但我无法理解
  • 如何使用Python将浮点数转换为具有预定义位数的定点数

    我有 numpy 格式的 float 32 个数字 假设是正数 我想将它们转换为具有预定义位数的定点数以降低精度 例如 数字 3 1415926 在 matlab 中通过使用函数 num2fixpt 变为 3 25 命令是 num2fixp
  • .bss 与 COMMON:什么去了哪里?

    来自我的书 bss 未初始化的全局 C 变量 COMMON 尚未分配的未初始化数据对象 我不得不说 我并没有看到明显的区别 我什至不太明白什么是未初始化 未分配的数据对象 似乎什么都没有 我用过 GNUreadelf工具尝试查看一些简单的
  • 从内核模块向用户空间通知 GPIO 中断[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一段代码可以检测内核模块中的 GPIO 中断 现在 我正在寻找一种机制 在检测到来自内核模块的 gpio 中断时通知用户空间 任何与不同选项
  • 如何根据 React 中的 javascript 对象渲染组件 X 次?

    我正在尝试渲染 X 数量的照片 具体取决于时间的长短OBJECT photos 是 我尝试过将数据附加到字符串中 但它不起作用 有什么好的解决办法吗 var RenderPhotos React createClass getInitial
  • Stata 的替代 IDE [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 I am used to R studio for R which has some features
  • C++ 对齐 new[]

    Overview 浏览时运算符 new 运算符 new cppreference com https en cppreference com w cpp memory new operator new 似乎我们有很多选项来分配具有特定对齐要
  • ASP.NET Core MVC 中的客户端验证

    我在让客户端验证在 ASP NET Core MVC 中工作时遇到问题 我已经用谷歌搜索并应用了这里的示例 http www discuzfeed com code lotooslo mvc 6 client side validation
  • 使用 pyfacebook 和 google 应用引擎编写 Facebook 应用程序时如何避免循环重定向?

    我正在尝试使用 Facebook 编写我的第一个应用程序 python 和 pyfacebook 托管在 Google App Engine 上 我面临的问题是 循环重定向 Firefox 死后抱怨 此页面不是 当我访问时正确重定向 htt
  • 企业云应用程序的 CSS 框架的最佳方法是什么?

    有多种方法可以设置每个页面中元素的样式 在企业应用程序中通常是CSS框架大小增加了约 1 MB 当您的用户使用较慢的互联网连接时 您应该减小 css 框架的大小 我们可以为我们的元素创建新的 CSS 例如 Blah并在 css 框架中对其进
  • 用户定义类型的 std::common_type 特征

    自 C 11 起 类型特征std common type被介绍了 std common type确定其所有模板参数之间的公共类型 在 C 14 中它的辅助类型std common type t还被引入是为了制作使用的代码std common
  • 操作栏左端的额外填充(更新 sdk 后)

    I don t know how this padding came up but there s no such padding until I updated my SDK to 21 Here s my code mActionBar
  • Java:如何在列表中存储数据三元组?

    java中将数据三元组存储在列表中的最佳方法是什么 a b c a b c 我通常使用 HashMap 来存储一对数据键 值 我应该使用 HashMap Arraylist 吗 或 ArrayList ArrayList thanks pu
  • 如何仅为 ASP.NET 5 (ASP.NET Core) 中的受保护操作添加令牌验证

    我已将 JWT 中间件添加到我的应用程序中 app UseJwtBearerAuthentication options gt options AutomaticAuthenticate true 现在 如果我的令牌未验证 例如过期 我仍然
  • 如何在访问中运行查询循环?

    我有一个数据库 其中有一个表 其中充满了用于检查另一个数据库的条件和错误消息 我想运行一个循环 以便根据第二个数据库中的所有表检查每个条件 并生成一个给出错误的报告 这在ms access中可能吗 例如 查询临界值表 id query er
  • PHP 尝试使用 preg_match 和 preg_replace 分配 127 TB 内存和内存泄漏

    我想我发现了一个问题 当 unicode 字符作为分隔符或有时在正则表达式中的任何位置时 该问题似乎会在 Apache PHP 中造成内存泄漏preg match and preg replace 这种情况可能会发生在更多的地方preg 方