私は大量の人を持ち、SOAPを介して外部リソースから詳細を取得し、データを変更して戻します。細部のサイズのために、私はPHPのメモリを128MBに増やしました。実行の約4時間後(おそらく実行に4日かかります)、メモリが不足していました。相続人は、それが何をするかの基本:ガベージコレクタはPHPでどのように動作するのですか
$people = getPeople();
foreach ($people as $person) {
$data = get_personal_data();
if ($data == "blah") {
importToPerson("blah", $person);
} else {
importToPerson("else", $person);
}
}
それはメモリを使い果たし、私はforeach
ループの前に$のデータを初期化することを決定したクラッシュしてtop
によると、プロセスのメモリ使用量が7.8%以上に上昇していない後12時間稼働しています。
私の質問は、再利用してもループ内で初期化された変数にガベージコレクタを実行しないのですか?システムはメモリを取り戻していますが、PHPはそれをまだ使用可能とマークしておらず、最終的に再びクラッシュします(私は256MBに上げましたので、2つのものを変更しています。スクリプトはこれに答えるために戻ってきますが、それを理解するためにさらに12時間待たずに)
私はZendフレームワークを使用していないので、このような他の質問は適切ではないと思います。
編集:私は実際にスクリプトやそれが何をしているかに問題はありません。現時点では、すべてのシステム報告に関する限り、私は何の問題もありません。この質問は、ガベージコレクタと、foreachループ内のリソースをどのように/いつ取り戻すか、そして/またはシステムがPHPプロセスのメモリ使用状況を報告する方法に関するものです。
これは2度投票された理由を聞いてみたいと思います... – Moses
'importToPerson()'ではどうなりますか? – PeeHaa
if($ data == "blah"){'?if($ data =" blah "){ – PeeHaa