【问题标题】:Fatal error: Out of memory (allocated 12582912) (tried to allocate 12582920 bytes)致命错误:内存不足(已分配 12582912)(试图分配 12582920 字节)
【发布时间】:2018-12-03 18:37:16
【问题描述】:

在 PHP 5 中,我的程序正在运行,但是当我将其更改为 PHP 7 时,表格的内容没有显示。这是错误

致命错误:内存不足(已分配 12582912)(试图分配 12582920 字节)在 E:\xampp\htdocs\account\classes\class.user.php 上 第 216 行

代码错误

for ($i=0; ($row = Sql::fetch_array($resource)) !== FALSE; $i++) {
        
                $users[$i] = new User($row["userId"], $dealerId);
                $users[$i]->populate();

这是getAllUsers()的全部代码

 public static function getAllUsers($dealerId) {
    
    $users = array();


    $sql_query = "SELECT userId FROM dealer_users WHERE dealerId='".$dealerId."' ORDER BY username ASC";
    $sql_query_1 = "SELECT COUNT(*) FROM dealer_users WHERE dealerId='".$dealerId."'";

    self::$lastCount = Sql::fetch_first_row_column($sql_query_1);

    $resource = Sql::query($sql_query) or die(mysqli_error($sql_query));

    for ($i=0; ($row = Sql::fetch_array($resource)) !== FALSE; $i++) {

        $users[$i] = new User($row["userId"], $dealerId);
        $users[$i]->populate();
    }


    Sql::free_result($resource);

    return $users;
}

【问题讨论】:

  • 它检索了多少行?您在询问数据库 - 但丢弃了结果 - 为什么?填充后用户对象的平均大小是多少? User::populate() 做什么?你的最大内存设置是多少?脚本在 PHP 5 中运行时的峰值使用量是多少?
  • (提示这是 6 个问题,可能会给我们一些关于正在发生的事情的线索)
  • 根据错误信息,您的内存限制配置为大约 12 MB。这是一个非常非常小的价值
  • @Nico:不,它正在尝试分配比当前多 12MB 的空间:)

标签: php mysql mysqli php-7


【解决方案1】:

这种类型的错误主要是由于以下三个原因之一:尝试使用大图像、太大的数据集或太少的可用内存。

您不使用图像,所以这很容易。
使用“正常”编码,它通常不是 memory_limit,但至少要确保它不是。它通常是 128MB 或更高,即使它有点低,你的代码也不应该消耗那么多。

所以可能是数据量。从那里继续:
这是溢出点的事实,并不意味着该功能是它的原因。可能是“其他功能”将桶装满了边缘,而那段特定的代码是“最后一滴”。

由于它试图分配比现有更多的 12MB,因此很有可能是循环。除了$users之外,函数范围内的大多数变量都很小。你用class User()'s 加载它。这是一堂大课吗?如果是这样,那是你的问题。

// A small improvement might be setting it to a single user first, mutate that small variable, and push the result to the array:  
$newUser = new User($row["userId"], $dealerId);
$newUser->populate();
$users[$i] = $newUser;

如果这还不够,请最小化数据。如果您使用 ID 和用户名创建概览,则不需要整套,只需选择相关信息。如果可以的话,把它分成块,以便清理内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2014-04-04
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多