ここから本文です

解決済みの質問

知恵コレに追加する

forループの回数を100回にすると最後まで動き、200回にすると途中で動かなく...

yutakenmochiさん

forループの回数を100回にすると最後まで動き、200回にすると途中で動かなくなります。

回数制限などあるのでしょうか?また動くようにする方法を教えて下さい!卒業がかかってます。。。

【質問】

環境:unix, PHP4.3

200MBくらいのXMLファイルを3つ、(researchers_2007.xml) (2008,2009も同様)
DOMで検索して出力するシステムを作成中です。

検索部分を単純化したソースを以下に記載します。

ここで、★を付けた部分のforループの回数を100回にすると最後まで動き、
200回にすると途中で動かなくなります。

メモリの部分が怪しいと疑ったのですが、ダメでした。
・PHPのワーキングメモリ、memory_limitは512MBに増設、1024MBにしても出力は変わらず(サーバの物理メモリは2GBあります)
・メモリの節約のためにarray(),やunset関数を使用



卒業がかかっています、日曜日中に完成してないといけないので、
どなたかアドバイスを下さい!
よろしくお願いいたします。





【ソース】

<?php


for($y=2007;$y<2010;$y++){

$doc2keys = array();
$doc2key = array();

$xmlurl = "researchers_".$y.".xml";
print "<br><br>".$y."******************************************************<br><br>";

$doc2 = domxml_open_file($xmlurl);
$doc2keys = $doc2->get_elements_by_tagname('keywords');
$count_keys = count($doc2keys);

for($j=0; $j<200; $j++){ //★100→300にすると途中で止まる
$doc2key = $doc2keys[$j]->get_elements_by_tagname('keyword');
$count_key = count($doc2key);

for($z=0; $z<$count_key; $z++){
$k++;
echo $k."<br/>";
}//for(z)

unset($doc2key[$j]);
}//for(j)

}//for(y)

echo "動いてます!";

?>



【出力】


2007******************************************************

1
2
3
4
5
6

~(省略)~

56958
56959
56960
56961
56962
56963

2008******************************************************

56964
56965
56966

~(省略)~

140176
140177
140178
140179
140180
140181

~(終了)

補足
ありがとうございます!error_reportingを知りませんでした!!
ちなみに時間のリミットも90まで解放してあります。

Allowed memory size of 536870912 bytes exhausted (tried to allocate 43 bytes) on line 19

こう出てしまっています。つまりメモリがやっぱり問題なんですかね。
unsetを使えばいいのでしょうか?解決する方法をお教え下さい!

違反報告

ベストアンサーに選ばれた回答

takecyan_mx2002さん

max_execution_timeにひっかかったりしてません?
デフォルトだと30秒です。
http://www.php.net/manual/ja/info.configuration.php#ini.max-executi...

ちゃんとdisplay_errosをE_ALLで出力していますか?
仮にmax_execution_timeで落ちてたとしたら、ちゃんと表示する設定になっていればエラーが出力されます。
仮に他の原因だったとしても、なにか手がかりが表示されている可能性があります。

追記

やはりメモリー制限で落ちているようですね。
ini_set()をプログラムの先頭にかけば、php.iniを書き換えることなくメモリーの制限値をかえることもできるので、メモリー制限をもっと増やしてみてはどうでしょうか。
物理メモリーが2GBでも、OSは足りない分のメモリーをHDDで補おうとする機構があるので(ものすごく遅くはなりますが)とにかくプログラムの要求するメモリーを2Gでも3Gでも与えてしまうのも手です。(好ましくはありませんが)

根本的な原因については書かれているコードだけではわかりかねます。
おそらくどこかで配列に限りなくデータをため続けているような部分があると思うのですが…。

PHP4.3.2以降であれば(条件次第では)この関数が使えます。
これをうまく使えば、コードのどこの部分でメモリーが増加しているかわかりますのでデバッグがしやすくなるでしょう。
http://php.net/manual/ja/function.memory-get-usage.php

あとはプログラムを動かしながらpsコマンド等で該当プロセスのメモリー使用量を見ることができますので、sleep()等とうまく組み合わせれば、memory_get_usage()の変わりになると思います。

  • 違反報告
  • 編集日時:2010/1/24 12:02:39
  • 回答日時:2010/1/24 03:53:34
この質問・回答は役に立ちましたか?
役に立った!

お役立ち度:お役立ち度 0点(5点満点中)0人が役に立つと評価しています。

ベストアンサー以外の回答

(1件中1〜1件)

 

kabukunmanさん

ん~・・・ 違うよぉ~な気もするけど、この処理ってけっこう重いかな?
もしかしたっけ、処理時間の制限にひっかかってるのかもしれんよ。
PHP、デフォルト状態だと、実行処理時間の制限(30分だったかな)設けてあったはず!

php.iniでmax_execution_timeって値を確認してみて!

詳細は・・・
max_execution_time ← こいつをキーワードで検索すれば、いろいろ出てくると思うよ。
max_execution_time = 0 とか感じで設定して、WWWサーバのリスタートすれば制限時間自体は変更できるはず!

したっけ・・・
これが原因じゃないとしたら、ちとわからんなぁ・・・

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

話題のキーワード

[カテゴリ:PHP]

ただいまの回答者

09時39分現在

2412
人が回答!!

1時間以内に4,581件の回答が寄せられています。

>>回答ひろばに行く