3

私はphp 5.2.5を使用しており、コマンドラインからスクリプトを実行しています。このスクリプトでは、db から取得したデータを操作しています。データベースからデータを取得するには、Zend Adapter を使用しています。「fetchAll($sql,$data,Zend_Db::FETCH_ASSOC)」を呼び出した後 、メモリ (262144 バイト) が増加していることに気付きました

したがって、最終的にメモリ不足につながります。テストするために、返されたデータを変数に保存することなく、「fetchAll」を実行しました。それでも、再利用されていないメモリの増加が見られます。

  • Zend FetchAll メソッドにメモリ リークの問題はありますか?
  • メモリが 262144 または 262144 の倍数増加するのはなぜですか?
  • メモリの増加はランダムに発生し、すべての fetchAll 呼び出しで発生するわけではありません。なぜですか?

メモリ リークの原因を特定するために memory_get_usage() を使用しようとしましたが、コードが大きいため時間がかかります。メモリ内のすべてのオブジェクトの詳細を取得してデバッグできる方法はありますか?問題はより良いですか?

SQL は次のとおりです。

select b.Id as Id,b.Lang 
from groups g 
left join table1 b on b.Group_Id = g.Id 
left join table2 bs on bs.Id = b.Id 
where g.Id = ? and b.Lang = ?
4

3 に答える 3

1

一度にすべての結果を返すには、メモリ内の配列に格納する必要があります。その結果を変数に割り当てなくても、fetchAll内部的にその配列を構築する必要があります。一度にメモリに保存するには結果が多すぎる場合、メモリが不足します。非常に簡単です。

メモリが常に再利用されるとは限らない理由については、メモリ リークが発生している可能性がありますが、PHP のガベージ コレクタがメモリを再利用するためにすぐに起動しない可能性が高くなります。gc_collect_cyclesそれを確認するために使用して gc サイクルを強制することができます。

于 2012-11-05T09:58:52.890 に答える
0

テストするために、データを保存せずに「fetchAll」を実行しました

しかし、すでにデータの 2 つのコピーを保存しています。ほとんどのデータベース クライアントは、サーバーから返されたデータのバッファーを維持します (mysql の場合、これには完全なデータ セットがあります)。fetchAll() を呼び出すと、データセット全体がバッファーに取得され (まだ存在しない場合) これが PHP 配列にマップされます。

明示的な closeCursor 呼び出しはありますか?

于 2012-11-05T12:56:08.540 に答える