そこで、独自の 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の内部の仕組みについて何も知りません...誰か意見やアイデアを持っていますか?