2012-03-22 5 views
4

私は無限ループで動作するコマンドラインスクリプトを開発しています。しばらくすると、メモリリークに起因すると思われるセグメンテーションフォルトが発生します。 psコマンドで生成された結果を見ると、スクリプトが使用するメモリがスクリプトがクラッシュする前に常に増加するように見えるため、私は正しいと思います。foreachループを使わずに連想配列を反復してメモリリークを引き起こす

私は、コマンドラインのPHPのメモリリークの一つの可能​​な原因が解除されることはありません配列のコピーを作成foreachループを使用することであると述べている、this articleを発見しました。いくつかの研究の後、それはそうであるように見える。だから私はforeachのループを全てforと置き換えることにしました。

最初の質問 - 私の推論は正しいですか?

第2のもの - 私は反復する連想配列を持っていて、私は現在のキーを知りたいのですが? forループでnext()key()関数の組み合わせを使用して - 私はarray_walk()、他のいずれかを使用することだろうと考えることができます

一つの方法。どのアプローチによってメモリリークが発生するのでしょうか?

私はいくつかのテストを行い、完了したら結果を投稿します。

二次的な問題は、反復可能オブジェクトを処理する方法ですが、それは後で行います。

EDIT 1:私のテストとはいくつかの異なる結果がありますので、いくつかのさらなる研究の後で新しいものを投稿します。

+1

ループ用に変更する必要がありますか?あなたが投稿した記事には、foreachループで状況を改善する方法が記載されています。何が起こっているのかを見るためのサンプルコードがありますか? – Panagiotis

+1

上記の記事で紹介したソリューションは、forループを使用しています。私が思うコードは無関係ですが、質問品質を改善するために現在書いているテストをいくつか掲載します。 – Przemek

答えて

1

next()とkey()を使用しても、foreachが行うメモリリークは発生しません。 Foreachは配列の "内部"コピーを作成し、そのコピーはメモリリークの問題です。 next()とkey()を使用してもコピーは作成されません。元のデータで作業しています。

しかし、これを解決する方法についての他の提案は、このようなarray_keys()を使用することです:

$keys = array_keys($assoc_array); 
for ($keyindex = 0; $keyindex < count($keys); $keyindex++) { 
    $key = $keys[$keyindex]; 
    $val = $assoc_array[$key]; 

    /* Now you have $key and $val. */ 

} 

をしかし、私は次の()とキー()を使用しての提案は1最も効果的であろうと考えている - とおそらくあなたにもきれいなコードを与えるでしょう! :)

関連する問題