PDO Sqlite`fetchAll()`耗尽所有内存

时间:2016-02-08 07:14:20

标签: php pdo sqlite

我有以下PHP脚本使用PDO连接到我的Sqlite3数据库并计算所有记录:

<?php

ini_set('max_execution_time', 300);
error_reporting(E_ALL);
ini_set("display_errors", 1);

$db = new PDO('sqlite:db/MYDB.sl3');
$result = $db->query('SELECT * FROM MYTABLE');
$rows = $result->fetchAll();
$row_count = count($rows);

echo "Rows: " . $row_count . "\n";

?>

如果我从shell运行它(PHP-CLI):

Rows: 175412

但是从网上运行它会引发以下错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 14 bytes) in /var/www/test/sqlitepdo.php on line 9

在PHP中设置内存不是一个解决方案,因为这甚至不应该发生,因为MySQL不会发生与结果相同的结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

所以你要创建一个175K行的数组,只是为了计算行数。这必然会造成内存问题。即使你设法解决这个问题也没有意义。

有鉴于此,134217728字节~134 MB。因此,每次调用该查询时,您正在读取超过134 MB的数据,即使您设法抑制错误,这本身也是一个问题。

您只需更改查询即可询问sqllite row count 的内容。

SELECT count(*) as c FROM MYTABLE

然后你只有1行行数,使用它。

$row = $result->fetch(PDO::FETCH_ASSOC);
echo "Rows: " . $row["c"] . "\n";

This 可以帮助解答为什么它不会在CLI模式下生成错误