我有以下代码执行包含数千条记录的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
答案 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