PHP データ オブジェクト関数で深刻な問題が発生しています。セット全体のフェッチを避けるために、バッファリングされたクエリを使用して、かなり大きな結果セット (~60k 行、~1gig) をループしようとしています。
私が何をしても、スクリプトは PDO::query() でハングするだけです - クエリがバッファリングされていないようです (結果セットのサイズを変更すると問題が「修正」されるのはなぜですか?)。問題を再現するための私のコードは次のとおりです。
<?php
$Database = new PDO(
'mysql:host=localhost;port=3306;dbname=mydatabase',
'root',
'',
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
)
);
$rQuery = $Database->query('SELECT id FROM mytable');
// This is never reached because the result set is too large
echo 'Made it through.';
foreach($rQuery as $aRow) {
print_r($aRow);
}
?>
妥当な数でクエリを制限すると、問題なく動作します。
$rQuery = $Database->query('SELECT id FROM mytable LIMIT 10');
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE で遊んで、PDO::prepare() と PDO::execute() も使用してみました (ただし、上記のクエリにはパラメーターはありません)、どちらも役に立ちませんでした。どんな助けでも大歓迎です。