2016-09-30 20 views
12

PHP7にアップグレードしていくつかのSQL文が機​​能しなくなり、代わりにメモリが不足していることに気がつきました。PHP7のPDO extは結果セット全体をメモリに読み込みますか?

私はこのコードを持っている:

$query = Yii::$app->db->createCommand('select * from tbl_title')->query(); 
while ($row = $reader->read()) { 
    var_dump($row); 
    exit(); 
} 

をそしてYii2のデータベース抽象化は、PDOのオーバーだけで非常に薄い層であり、余分な何もしません。 query()は、プロファイリングのためにログファイル(Yii2's)に行を追加し、reader->read()はPDOストリームのfetch()関数を呼び出します。

しかし、それはメモリすなわち、私のテーブルのサイズ(スペース使用)を引用し、プロセスメモリの385メガバイトを割り当てるしようとしているのを使い果たし:

排出134217728バイトの

可メモリサイズが(385883840バイトを割り当てしようとした

結果セットがPHPプロセスの128 MBの制限に完全に当てはまるクエリを使用すると、スパナとして動作します。

PHP7が変更されました。変更することはできますか?

答えて

8

これはPHP7に直接関連するものではありません。この問題は新しいmysqlndドライバに起因するので、PHP 5.xでも同じ問題が発生する可能性があります。メモリがまだ割り当てられる前でもであったので、実際にはバグ修正ですが、memory_limitにはカウントされませんでした。

メモリの問題を回避するには、大きな結果セットに対してバッファリングされていないクエリを使用する必要があります。

ので、大規模なデータセットを期待しているクエリに対して、このような適切な設定設定:

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, TRUE); 

さらに読書のために、私は、重要なフィードバックだったNikic、のおかげでdecent explanation in my PDO tutorialを持っています非常に貴重です。

+3

ネストされたクエリを実行して行数を取得できないなどの副作用に留意してください。 –

+0

ええと、バッファリングされていない他のすべてのクエリもブロックします – Sammaye

関連する問題