2016-02-08 63 views
0

我有使用PDO連接到我的sqlite3的數據庫和計數的所有記錄下面的PHP腳本:PDO SQLite的'使用fetchall()`耗盡所有內存

<?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相同的結果。

有什麼想法?

回答

2

所以你創建一個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方式產生錯誤

+0

SQLite的有'COUNT(*)'而不是'COUNT(別的)'了特別的優化。 –

+0

是的,這工作。請在答案中編輯雙「echo」,以便我可以接受它。 – bsteo

+0

兩件事情都已更新 –