【问题标题】:Allowed memory size of 67108864 bytes exhausted允许的内存大小为 67108864 字节已用尽
【发布时间】:2012-08-08 13:37:04
【问题描述】:

我一定已经阅读了这里所有类似的帖子,但仍然无法弄清楚为什么会发生这种情况。

我的代码:

$stmt = $this->db->stmt_init();
        $stmt->prepare("SELECT Table1.id,Name,type,text,fname,lname FROM Table1, Table2 WHERE Table1.email = Table2.email AND type='text' AND Table1.Id=?");
        $stmt->bind_param("i", $id);
        $stmt->bind_result($legTxtId,$legTxtName, $legTxtType, $legTxtText, $legTxtFname, $legTxtLname);
        $stmt->execute();
        $results = array();
        while($stmt->fetch())
        {
            $results[] = array(
                    'legTxtId' => $legTxtId , 'legTxtName' => $legTxtName , 'legTxtType' => $legTxtType , 
                    'legTxtText' => $legTxtText , 'legTxtFname' => $legTxtFname ,
                    'legTxtLname' => $legTxtLname );
        }
        $stmt->close();
        return $results;

现在我在另一个函数中使用完全相同的代码,该函数在此函数之前调用,即使它返回一个字段,它也可以正常工作。

这个特别只返回 1 行,只有纯短文本(没有照片或任何东西),所以它不应该失败,因为它肯定小于 64M。

谁能看出问题出在哪里?

【问题讨论】:

  • 你的Table 1Table 2有多少条记录?
  • 两个查询都应该只返回一行 atm ..第一个这样做根本不起作用..即使我删除第一个这也会失败并且我知道查询是有效的所以..
  • 这些字段是否有MEDIUMTEXTMEDIUMBLOB 或类似字段——能够存储大量数据?一个类似的问题是posted recently,您可能必须切换到 PDO 或启用 mysqlnd 才能使其工作。
  • 你没有明白我的意思。此查询在内存中打开两个表实例,并将每个(表 1)行的电子邮件与另一个表中的相应条目进行匹配。这就是为什么我问你桌子的大小。如果两个表都包含大量数据,您可以求助于mysqlnd 或查找一些高效/优化的数据检索技术。
  • dev.mysql.com/downloads/connector/php-mysqlnd。我想上面@DCoder 提供的链接可能对您有所帮助。请通过它。

标签: php mysql memory mysqli


【解决方案1】:

正如在另一个问题中所讨论的,这两种解决方案似乎是:

1) 切换到mysqlnd 连接器,因为这不会显示相同的错误。

如果您使用 Yum 安装 PHP(例如在 Amazon ec2 服务器上),那么您可以通过更改 LAMP 堆栈的设置来实现:

sudo yum install php-mysql php php-xml php-mcrypt php-mbstring php-cli mysql httpd 

到:

sudo yum install php-mysqlnd php php-xml php-mcrypt php-mbstring php-cli mysql httpd 

2) 使用 store_result 或 use_result 也不会显示大量内存分配问题。

切换到 mysqlnd 可能是一个更好的长期解决方案,因为它通常比现有的 php-mysql 连接器编写得更好(例如,结果在复制到 PHP 内存之前不会在 MySQL 内存中复制)并且是 PHP 的默认连接器5.4.0 起。

【讨论】:

    【解决方案2】:

    那你为什么要对一条记录使用while循环呢?

    【讨论】:

    • 它并不总是一个记录。只是在这个阶段我只有一个记录。
    • 添加第二条记录并尝试运行相同的脚本。就是为了晚上睡觉。
    • 您是否尝试过直接从控制台或 phpMyAdmin SQL 选项卡运行准备 SQL 语句?你检查过数据库错误日志吗?
    • 你能检查一下你的 php.ini 文件,你使用了 64M 的值吗?
    • 只是memory_limit设置为64M
    【解决方案3】:

    将数据移动到本地缓冲区可能会有所帮助:

    // ...
    $stmt->prepare(...);
    $stmt->bind_param(...);
    
    $stmt->execute();
    $stmt->store_result();
    
    $stmt->bind_result(...);
    // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 2013-07-22
      • 2015-03-06
      • 2018-01-29
      • 2012-08-29
      • 2020-10-06
      • 2018-02-24
      • 2017-02-18
      相关资源
      最近更新 更多