4

配列値のガベージ コレクションは、通常の変数のガベージ コレクションのように機能しますか?

つまり、各配列キーが設定解除されるか、配列全体がそれへのポインタを持たなくなるまで、完全な $array はメモリに保持されますか、それとも配列キーへの参照がなくなった場合、PHP は配列キーのメモリをクリーンアップしますか?

私が求めているのは、PHP が配列を 1 つの変数ガベージ ワイズとして扱うのか、それとも配列の実際の部分として扱うのかということだと思います。

私の質問を説明するのに苦労していますが、うまくいけば、これは誰かにとって理にかなっています:)

私の質問の理由は、潜在的に大きな結果セットを SQL から PHP オブジェクトの配列に変換してから、この配列をフィルタリングすることです。ここで得た回答に応じて、フィルタリング機能を多少変更する可能性があります。

4

1 に答える 1

2

巨大な画像や大きな SQL クエリの結果など、変数が大量のメモリを使用することがわかっている場合は、変数の設定解除を開始することをお勧めします。十分なメモリがありません。またはあなたのウェブサーバー。まだ使用されているメモリのブロックの途中でメモリの小さな部分を解放しても意味がありません。再利用されることはありません。また、メモリを並べ替えると、パフォーマンスが低下します。PHP は、変数の処理に関してかなり最適化されています。

変数の設定を解除すると、その値を指す他の参照がない場合、そのメモリが解放されます。これは配列にも当てはまります。すべての配列キーはその値への参照であり、それらが唯一のキーである場合、配列自体を設定解除すると、内部に格納されているすべての値が設定解除されます。

クエリの結果はすべてメモリに格納されることを知っておく必要があります。直接アクセスすることはできませんが、読み取りたいエントリを指すことができるmysqli_result::data_seek()mysqli_result::fetch_assoc()のような関数があり、次の呼び出しでそれを取得します。

mysqli_result::free()実際に結果を配列にコピーしている場合は、クエリ結果を削除するまで ( を明示的に呼び出すか、結果オブジェクトの設定を解除することによって) 、メモリ消費量が少なくとも 2 倍になります。

ただし、 ArrayAccessインターフェイス (およびおそらくIteratorCountableも)を実装する mysqli_result の周りにラッパーを作成することもできます。これはあなたの配列です-コピーせずに。ランダム値へのアクセスは、最初に を呼び出しseek()、次にを呼び出し、fetch_assoc()値を返します。

その後、すべての SPL クラスを自由に利用できます。foreach で実行したときに結果をフィルタリングしたいですか? 独自の FilterIterator を実装し、結果ラッパーを内部に配置するだけです。

于 2013-05-09T10:24:44.817 に答える