允许的内存大小为134217728字节耗尽+ mysql + php

时间:2014-08-30 19:29:16

标签: php mysql

我有以下代码执行包含数千条记录的SQL查询:

    <?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);
     ini_set('memory_limit', '2000M');
    ....    
               $dbquery = $data -> prepare("SELECT *  FROM FILE ORDER BY ID");
               $dbquery -> execute();     
               $data = $dbquery -> fetchAll(PDO::FETCH_ASSOC);
               foreach($data as $rows):
                       $values[] = array('fecha'      =>  $rows['UPDATED']
                                        );
    ....

修改我的 /etc/php5/cli/php.ini 和我的 /etc/php5/apache2/php.ini 。但仍然没有显示记录,你会推荐哪一个?如果你放置&#34;限制10&#34;在我的查询中,如果我显示一些记录,问候!

memory_limit = 9999M

2 个答案:

答案 0 :(得分:3)

当处理数千行时,通常可以更加节省内存,而不是将整个结果集单独提取到内存中。现在,您正在使用fetchAll(...)将来自FILE的所有记录加载到$ data中,然后您将循环遍历它。从我所看到的情况来看,这是不必要的,使用以下代码可以通过更少的内存使用来实现相同的结果:

$dbquery = $data->prepare("SELECT * FROM FILE ORDER BY ID");
$dbquery->execute();
while($rows = $dbquery->fetch(PDO::FETCH_ASSOC)) {
    $values[] = array('fecha' => $rows['UPDATED']);
}

这里的变化是,只要while循环需要它,单个记录只在内存中,这通常非常短,因此内存效率更高。这应该允许更低的内存限制(即最大文件大小+几MB)。

看到你的表被称为FILE我可以想象它包含各种大小的文件。如果您实际使用存储在数据库中的文件内容(我推测),您的while循环内容当前不会显示,但如果不这样做,只需选择所需的列就可以实现更高的内存效率。例如:

$dbquery = $data->prepare("SELECT UPDATED FROM FILE ORDER BY ID");

最后的建议是将文件存储在数据库中但存储在文件系统中,并且只存储数据库中文件的路径。大多数数据库引擎(MySQL也是如此)不是为实际文件系统而设计的文件存储,所以使用它会更有效率。

答案 1 :(得分:0)

如果要允许无限内存,可以使用此代码 但是,不建议设置无限制。

<?php ini_set('memory_limit', '-1'); ?>

如果你在php.ini中设置

,请重启你的apache