何も考えずに70万件くらいのテーブルから全データSELECTしたらメモリが足りなくなってしまいました。(当然)
結論
メモリがたりない
$selectSql = "SELECT * FROM でかいテーブル";
// query() すると結果のデータがPHPのメモリに乗ってしまい、メモリが足りない。
$statement = $this->query($selectSql);
while($row = $statement->fetch(PDO::FETCH_ASSOC)){
//なんなりと
}
だいじょうぶ
$selectSql = "SELECT * FROM でかいテーブル";
// 以下オプション付きでprepareすればOK。
$statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
// 実行
$statement->execute();
//第二引数はデフォルト値と同じなので、省略しても良い
while($row = $statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)){
//なんなりと
}
感想
パラメタの無い単なるSELECT文をプリペアドステートメントで実行するという発想がなかった。。
注意点
//prepare の場合、rowCount() が取れない
$selectSql = "SELECT * FROM でかいテーブル";
$statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$statement->execute();
$statement->rowCount();//0件
参考
https://www.php.net/manual/ja/pdo.prepare.php
https://www.php.net/manual/ja/pdostatement.fetch.php