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 内存和内存泄漏 的相关文章

  • 是否存在类似于适用于 Ruby 的 ActiveMerchant 的 PHP 项目?

    我很好奇是否有人知道 ActiveMerchant 中存在的具有类似通用支付处理器功能的 PHP 功能 如果您正在寻找类似 PHP 中的 Active Merchant 的内容 请检查this http github com akDevel
  • 将加载 gif 添加到简单脚本中

    我对 Javascript 真的很陌生 但我已经有了这个加载 url 内容的脚本 一切都工作正常 我使用按钮上的 onClick 方法调用 plannerSpin 函数 但是当这一切发生时 我将如何显示动画 gif var xmlHttp
  • 在非 WordPress php 页面之外显示 WordPress 帖子

    我需要在非 WordPress php 页面中显示 WordPress 博客文章 我已经尝试过以下代码
  • 递归树遍历 - 如何跟踪递归级别?

    我基本上试图从表示树结构的多维数组构建 html ul li 嵌套列表 下面的代码工作正常 但我想改进它 我需要一种方法来跟踪递归级别 以便我可以将不同的类应用于不同的级别 向生成的输出添加缩进等 function buildTree tr
  • 传递表单变量的安全方式

    我正在为我的 WordPress 主题构建联系表单 我希望能够从后端输入接收者地址 目前我正在传递带有隐藏输入字段的变量
  • 使用 Stripe 创建订阅后如何获取费用 ID?

    我在用Stripe作为支付网关 现在有一个大问题困扰着我 我使用下面的代码来创建订阅
  • 如何使用Google API PHP SDK获取用户信息

    我正在尝试为拥有 Google 帐户的用户添加登录选项到我的网站 我已经能够实现这个 Facebook 但在使用 Google 获取用户帐户信息时遇到问题 我正在使用位于此处的 Google PHP SDK https github com
  • parse_str():jwage/purl 中不推荐调用不带结果参数的 parse_str()

    public function postIndex url new Url https www dropbox com 1 oauth2 authorize url gt query gt setData response type gt
  • Codeigniter子域路由

    我正在尝试在 CodeIgniter 框架上运行的网站上设置博客脚本 我想在不对现有网站代码进行任何重大代码更改的情况下执行此操作 我认为创建一个指向另一个控制器的子域将是执行此操作的最干净的方法 我设置新设备所采取的步骤Blog涉及控制器
  • 将平面数组拆分为分组子数组,其中包含输入数组中连续键的值

    我有一个数组array diff函数 如下所示 Array 0 gt world 1 gt is 2 gt a 3 gt wonderfull 5 gt in 6 gt our 正如您所看到的 键 3 和键 5 之间有一个间隙 即没有键 4
  • 不要回显 cURL

    当我使用这段代码时 ch curl init url statuses curl exec ch curl close ch 我得到了我想要的东西 但如果我只是使用它 statuses被回显到页面上 我怎样才能阻止这个 将其放在第 2 行
  • 无法访问扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller 的控制器中的 Symfony2 容器

    原始问题 我已经阅读了 book http symfony com doc current book service container html 关于服务容器 我仍然感到困惑 因为几乎每次我尝试使用时 事情似乎都随机不起作用 this g
  • CodeIgniter 删除 index.php 和 .htaccess

    我已经为此工作了一个小时 所以我想我不妨问一下 我正在尝试从 CodeIgniter 应用程序的 URL 中删除 index php 但无法执行此操作 该应用程序在我办公室的专用服务器上运行 我通过 url 访问该应用程序http smr
  • 根据用户的时间设置问候语(早上好,下午好......)

    任何人都可以推断如何根据用户的时间设置实现基本的 晚上好 或 早上好 也许 PHP 会获取服务器时间 但我希望用基于时间的适当问候语来问候网站访问者 并考虑到他们一天中的时间 E G 早上好 晚上好 下午好 基于它 getHours 日期对
  • 返回导航缓存 - IE

    当我在 IE 11 上运行 Web 应用程序时 收到如下警告消息 DOM7011 此页面上的代码禁用了后退和前进缓存 为了 更多信息 请参阅 http go microsoft com fwlink LinkID 291337 http g
  • 未定义的变量:$_SESSION

    我越来越E NOTICE当核心 CakePHP 文件尝试引用从未设置或未设置的会话时 会出现错误 cake libs cake session php line 372 function read name null if is null
  • 从 array_map 匿名函数内部调用类方法

    我正在尝试从一个对象中调用我的对象的方法之一array map匿名函数 到目前为止 我收到了预期的错误 致命错误 不在对象上下文中时使用 this 我知道为什么我会收到此错误 我只是不知道如何实现我想要的目标 有人有任何建议吗 这是我当前的
  • 新部署后,React 应用程序必须清除浏览器缓存

    我们正在使用 Jenkins 管道在 apache 服务器上部署 React 应用程序 当我们部署新代码时 大多数新功能都可以正常工作 但并非所有更改都反映浏览器中的最新内容 用户必须打开隐身窗口或清除缓存才能看到新功能 我见过一些相关的解
  • PHP Session Id 在页面之间发生变化

    我有一个问题 我在 2 个页面之间丢失了 PHP 会话 session start 包含在一个名为 session inc php 的文件中 该文件包含在每个需要设置会话的页面中 这适用于网站上除一个特定页面 member profile
  • cUrl 在本地主机上工作正常,但在服务器上不起作用,仅显示空白页面

    当我在服务器上运行以下代码时 它只显示空白页面并突然停止进一步执行 我还检查了已安装的服务器上的 cUrl 这是我的代码 ftp server ftps server Voorraadtonen link csv ch curl init

随机推荐

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

    我试图通过创建一个程序来学习 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 方