PHPのエラーログに"Undefined index: REMOTE_ADDR"

PHPのエラーログに"Undefined index: REMOTE_ADDR"

- Tatsuya Shirai の投稿
返信数: 2

 phperror.logに大量の,

[10-12-2008 22:20:01] PHP Notice:  Undefined index:  REMOTE_ADDR in C:\****\*****\moodle\lib\moodlelib.php on line 7723

という記録が残っています.どうやら$_SERVER['REMOTE_ADDR']が存在しないということのようです.

 これは可能な限り正確なIPアドレスを取得する関数,function getremoteaddr()の中に存在する,

    return cleanremoteaddr($_SERVER['REMOTE_ADDR']);

です.では,なぜREMOTE_ADDRが存在しないのかと言うと,サーバ上でadmin/cron.phpをダイレクトにPHPで実行しているためです.Apacheを介さないので当然ですね.このログは5分毎に記録されている訳ではないので,ある程度の時間間隔(たしかランダム)に実行される処理の中で呼ばれているのだと予想されます.(add_to_log()でも使われる)

 実際,mdl_logのテーブルを見てみると,いくつかIPアドレスの欄が空欄のデータがあります.それを[レポート]-[ログ]で見てみると,IPアドレスの欄が「ここをクリック...」となっていて,クリックするとIPlookupのウィンドウが開いて「無効なIPアドレスフォーマットです.」とエラー表示されます.http://www.suzuka-ct.ac.jp/mech/moodle/iplookup/index.php?ip=&user=104 このように?iP=の後が空欄なのですから当然です.


 このように,function getremoteaddr()が正しかろうが間違っていようがIPアドレスを返してくれないことを考慮されていないのはどうでしょうね.Noticeが発生しないようにするならば.

    return cleanremoteaddr($_SERVER['REMOTE_ADDR']);

の直前に,

    if (!isset($_SERVER['REMOTE_ADDR'])) return false;

を追加すれば良いのですが,でも,果たしてそれで解決になるのでしょうか.

 あるいはREMOTE_ADDRが存在しない場合はfalseではなく,サーバのIPアドレスを返すという手もあるかも知れません.ただ,REMOTE_ADDRがセットされなかった原因がPHPを直に実行した場合以外にもあるならば切り分けが必要かも知れません.

Tatsuya Shirai への返信

Re: PHPのエラーログに"Undefined index: REMOTE_ADDR"

- Tatsuya Shirai の投稿

 同じことに気付いている方がいるようですね.

http://tracker.moodle.org/browse/MDL-16954

でも,問題としている箇所が違う.

Tatsuya Shirai への返信

Re: PHPのエラーログに"Undefined index: REMOTE_ADDR"

- Tatsuya Shirai の投稿

 この件もコメントしておきましたら,早速直してもらえたようです.

 Moodle1.9.4から修正されているようです.