模倣は上達への近道とはよくいったもので、保守フェーズで既存モジュールを模倣してロジックを書いてました。
そのときにはまってしまった問題についての備忘録です。
【やりたかったこと】
PDOを利用して、大量データを処理したい。
【発生した問題】
なぜかPHPのプロセスが途中で死んでしまう。
(例外すらスローされない)
【OKロジック】
1$sql "select * from tbl_hoge where hoge = ?";
2$params = array('hoge'=>1);
3$stmt = $pod->prepare($sql);
4$rs = $stmt->execute($params);
5while ($row = <span style="color: #ff0000"><span style="text-decoration: underline">$rs->fetch(PDO::FETCH_ASSOC)</span>) {</span>
6print_r($row);
7}
8
【NGロジック】
1$sql "select * from tbl_hoge where hoge = ?";
2$params = array('hoge'=>1);
3$stmt = $pod->prepare($sql);
4$rs = $stmt->execute($params);
5$result_array = <span style="text-decoration: underline;color: #ff0000">$rs->fetchAll(PDO::FETCH_ASSOC)</span>;
6foreach ($result_array as $row) {
7print_r($row);
8}
9
【原因と反省】
もうおわかりですね。はい。SQLで大量データを取得して
fetchAll(全データを配列に変換)を利用したのがまずかったようです。
fetch(1行ずつ取得)を利用すれば解決しました。
ちなみに、SQLの結果セットをlimit句で相当数絞ってからfetchAllを利用してもNGでした。
担当したPJのモジュールは、fetch,fetchAllもラッピングされており理解せずに関数を利用(模倣)してました。
関数利用の際は、きちんとマニュアルを確認して理解したうえで、利用しないといけないですね。