9

数十の仮想ホストを持つ専用サーバーがあります。mail() 関数を呼び出しているファイルを特定し、これをグローバルにログに記録したいと考えています。私はそのようなものが必要です:

[Wed Feb 13 10:42:39 2013] mail() called from /var/www/example1.php on line 70
[Wed Feb 13 10:42:40 2013] mail() called from /var/www/example2.php on line 70

サーバー内のどの PHP ファイルにもこれを追加できないため、debug_backtrace() などは使用できません。エラーが error.log のようなファイルに記録されるように、すべての関数呼び出しをファイルにグローバルに記録できますか?

ありがとう

4

4 に答える 4

3

一般に、これには問題があります。PHP にはロギング メカニズムが組み込まれていないため、それを行うには PHP システムに何かを追加する必要があります。

私が見ているオプション:

  1. PHP コードを変更します。質問であなたが言ったことを考えると、これはオプションではないと思いますが、それは明らかな答えであるため、明記する必要があります。(PHP のmail()機能は非常に基本的なものであるため、PHP コードを作成する人は、正気を保つためにとにかくラッパー クラスを使用する必要があります)

  2. 関数について具体的に話している場合は、呼び出すmail()sendmail クライアントをログに記録することでログに記録できますmail()。サーバー上のシステムは、PHP の関数sendmailによって呼び出される UNIX シェル スクリプトによって制御されている可能性があります。mail()このシェル スクリプトを変更して、メール イベントをログに記録できるはずです。これはおそらく行番号などの詳細を提供することはできませんが、それを行っているユーザーなどはわかります.

  3. Suhosin PHP hardening patchを使用します。これは、多数のセキュリティ関連機能を提供する PHP のパッチです。とにかく、共有ホスティング環境には強くお勧めします. ただし、ログ機能も含まれています、これにより、ファイル名や行番号など、特定の機能の使用状況をログに記録できる場合があります-つまり、まさに探しているシナリオです。これが私が推奨する解決策です....ここで発生する唯一の大きな問題は、PHPバージョンを最新の状態に保っていた場合です.Suhosinは現在、5.4ではなくPHP 5.3でしか利用できないためです. PHP 開発者として、私は自分のサーバーで PHP 5.4 を取得することを強く望んでいますが、プロバイダーとしては 5.3 も引き続きサポートされているため、何も問題はありません。(反対に、まだ 5.2 を使用している場合は、何年もサポートされておらず、既知のセキュリティ ホールがあるため、できるだけ早くアップグレードする必要があります)。

于 2013-02-13T10:18:17.857 に答える
3

>= PHP 5.3.0 以降では、.logilfe の目的の場所へのパスを指定するだけですphp.ini

mail.log = /path/to/some/logfile

詳細については、PHP ドキュメントを参照してください。

于 2015-12-08T21:57:54.527 に答える
0

あなたができることは、phpソースコードをダウンロードし、このファイルを編集することです:

ext/standard/mail.c

そこにロガーを追加します。

次に、再コンパイルします。

これはおそらく、誰がどこからphp関数を呼び出しているかを暗黙的にデバッグできる唯一の方法です。

于 2013-02-13T10:22:12.933 に答える