我有以下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不会发生与结果相同的结果。
有什么想法吗?
答案 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模式下生成错误