【问题标题】:What would cause a mysqli statement to use 4GB of memory when the returned data is less than 10k?当返回的数据小于 10k 时,什么会导致 mysqli 语句使用 4GB 内存?
【发布时间】:2015-07-09 14:40:24
【问题描述】:

搜索了高和低,找不到答案..除了“提高你的 PHP 内存使用限制”,在这种情况下没有任何意义。就这样吧。。

这是一段代码(经过编辑以显示我之前放在这里的代码):

<?php
define('DB_NAME', "XXXXXX");
define('DB_USER', "XXXXXX");
define('DB_PASS', "XXXXXX");
define('DB_SERVER', "cloud1.XXXXXXXX.com");

// Create connection info
global $dbLink;
$dbLink= mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME) ;

/*------------------------- Retreiving columns names --------------*/

$event_stmt1 = mysqli_prepare($dbLink,"select form_id,display_meta from wp_rg_form_meta order by form_id asc");
mysqli_stmt_execute($event_stmt1);
mysqli_stmt_bind_result($event_stmt1, $id, $display_meta);

这个数据库表实际上有 20 行。这是从这 20 行返回的内容(顺便说一下,这是正确的数据):

当我第一次运行这段代码时,出现了这个错误:

Fatal error: Allowed memory size of 805306368 bytes exhausted (tried to allocate 4294967296 bytes)

这发生在“mysqli_stmt_bind_result...”行。

世界上有什么会导致它要求超过 4GB 的内存?知道如何摆脱这个吗?

添加以显示表的“描述”:

【问题讨论】:

    标签: php apache unix memory mysqli


    【解决方案1】:

    This is a PHP bug.

    您的选项(按优先顺序)是:

    • 将您的服务器升级到 PHP 5.4 或更高版本。 PHP 5.4 使用了不同的 MySQL 接口库 (mysqlnd),它不受此 bug 的影响。

    • mysqli_stmt_bind_result() 之前调用mysqli_stmt_store_result(),以便PHP 将整个结果集加载到内存中。但是请注意,这将要求将查询返回的所有数据一次加载到内存中,这可能会导致大型结果集出现问题。

    • 将该列的类型从 LONGTEXT 更改为更短的类型。例如,MEDIUMTEXT 的最大大小为 16 MB,而不是 4 GB,因此它对内存使用的影响较小。

    【讨论】:

    • 因此,我要感谢您的回答,因为在进行了一些研究后,我们发现了以下内容:将字段更改为“mediumtext”完全解决了问题。而且.. 我倾向于相信这在 5.4 PHP 版本上不会有问题——正如你提到的。谢谢黄昏。
    • 附带说明...此字段来自 Wordpress 的“重力形式”插件。为了遗留系统,我还将向他们报告这个问题。
    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 2023-01-13
    • 2010-11-16
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2015-08-24
    • 2017-12-17
    相关资源
    最近更新 更多