0

そこで、独自の PHP エラー ハンドラーを生成し、すべてのエラーをログ ファイルに記録する方法を考え出しました (ユーザーには表示されません)。UNIQUE エラーのみを記録する 2 つ目のログ ファイルも作成しました。

register_shutdown_function('fatal_handler'); を呼び出して、致命的なエラーに対処する方法を見つけました。

私の fatal_handler は、私の通常のエラー ハンドラーが使用するのと同じ関数を使用したため、致命的なエラーはまったく同じ方法でログに記録されます。

しかし、ここで奇妙なことが起こります。致命的なエラーを呼び出すと、エラー ログ関数からこれらすべてのエラーが発生します。

警告: file_put_contents(): open_basedir 制限が有効です。ファイル (errors.log) が許可されたパス内にありません: ...

警告: file_put_contents(errors.log): ストリームを開けませんでした: 操作は許可されていません

警告: fopen(unique_errors.log): ストリームを開くことができませんでした: 操作は許可されていません

その後、fgets、fclose、および file_put_contents 関数も同様のエラーで失敗します。

これらのエラーが通常のエラー ハンドラではなく、fatal_handler で発生するのはなぜですか? 致命的なエラーをログに記録するときは、どうすればよいですか?

編集 :

*おそらく、アクセスしようとしているログ ファイルは、open_base_dir 制限エラー メッセージにオプションとしてリストされているパスのサブ フォルダーに存在することに言及する必要があります。したがって、エラーは許可されたパス内にあるため、意味がありません。結局のところ、致命的なエラーではなく単なる通知である場合、問題なく機能します.*

もう一度私の質問: なぜ file_put_contents() は通常のエラー ハンドラーでは機能するのに、致命的なエラー ハンドラーでは機能しないのですか?

イベントは別のレベルで発生しているため、致命的なエラーハンドラーでファイルへのパスを別の方法で指定する必要があると思います...?私は本当にphpの内部の仕組みについて何も知りません...誰か意見やアイデアを持っていますか?

4

2 に答える 2

0

それを見つけた!

すでに試したと思っていましたが、昨日は疲れすぎていたに違いありません。間違えたからです。

私のアクセス可能なディレクトリの1つは次のとおりです。

/home/www/USER_ID/html/

私のログファイルは

/home/www/USER_ID/html/MYSITE/SUBFOLDER/errors.log

エラーを引き起こすファイルは

/home/www/USER_ID/html/MYSITE/index.php およびエラーを引き起こす他のすべてのファイルは、このファイルの隣にあります。

エラー ハンドラの関数は、次のファイルに含まれています。

/home/www/USER_ID/html/MYSITE/SUBFOLDER/errorshandlers.php

通常のエラーハンドラーの場合、ログファイルを次のように指定できます

$file = サブフォルダー/errors.log;

しかし、致命的なエラーハンドラーについては、私は言わなければなりません

$file = /home/www/USER_ID/html/MYSITE/SUBFOLDER/errors.log;

それならうまくいく!:-)

于 2013-05-20T00:59:50.327 に答える
0

ただし、PHP 実行可能ファイルはデフォルトで多くの場所にアクセスできます。PHP がインストールされているディレクトリ、ログ ファイルが存在するディレクトリ、php.ini、Windows の一時ディレクトリなど...

実行されるスクリプトが読み書きできるディレクトリへのアクセスを制限できます。これはセキュリティ対策であるため、特定の php スクリプトにエクスプロイトがあったとしても、コンピューターの残りの部分は侵害されません。これは open_basedir で行われます。

open_basedir に複数のディレクトリを設定できると思います (よくわかりません)。しかし、php.ini が存在するディレクトリにアクセスできるように open_basedir を設定しないことをお勧めします。その場合、open_basedir を削除した方がよいからです。

于 2013-05-19T13:11:56.907 に答える