2013-02-13 9 views
8

私は数十の仮想ホストを持つ専用サーバーを持っています。私はどのファイルがmail()関数を呼び出しているかを判断し、これをグローバルに記録したい。私は、サーバー内の任意のPHPファイルにこれを追加することはできませんので、私はdebug_backtrace()または同様のを使用することはできませんPHPの関数呼び出しをすべてログに記録するには? (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 

:私はそのようなものが必要。エラーがerror.logのようなファイルに記録されているように、すべての関数呼び出しをファイルにグローバルに記録できますか?

ありがとうございます。

+1

最も簡単な方法は、 'sendMail'のような独自の関数を作成することです、witchはアクションを記録し、メールを送信します。 – Peon

+0

http://xdebug.org/またはhttp://code.google.com/p/webgrind/からお手伝いできますか? – Stephan

+1

xdebugはそのような機能を提供しますが、すべての仮想ホストでグローバルにトレースを有効にするとパフォーマンスが良いとは限りません。 – Jon

答えて

3

一般的に、この問題は起こります。 PHPはロギング機構を内蔵していないので、PHPシステムに何かを加えてそれを行う必要があります。

オプション私はそれを見るように:

  1. は、PHPのコードを変更します。あなたが質問で言ったことを考えれば、これは選択肢ではないと思いますが、明白な答えであるので、それを述べる必要があります。我々はmail()機能について具体的に話をしている場合、我々はそれをログに記録でき

  2. (PHPのmail()機能は、PHPのコードを書いて、誰もが本当にちょうど彼らの正気を維持するために、とにかくそのためのラッパークラスを使用してされるべきであるように基本的なものです) mail()が呼び出すsendmailクライアントを記録します。サーバー上のsendmailシステムはおそらく、PHPのmail()関数によって呼び出されるUNIXシェルスクリプトによって制御されます。このシェルスクリプトを変更して、メールイベントを記録することができます。これは、おそらくあなたに行番号のような詳細を与えることはできませんが、それはあなたにそれをやっているユーザーを教えてくれるでしょう。

  3. Suhosin PHP hardening patchを使用してください。これは、数十のセキュリティ関連機能を提供するPHP用のパッチです。とにかく共有ホスティング環境に強くお勧めします。しかし、あなたにはlogging featuresも含まれているので、ファイル名や行番号などの特定の機能の使用状況を記録することができます。これは私がお勧めする解決策です。あなたがここで唯一の大きな問題は、Suhosinが現在5.4でなく、PHP 5.3でのみ利用可能であるため、最新のPHPバージョンを最新に保っているかどうかです。 PHP開発者として私のサーバー上でPHP 5.4を入手しようとしていますが、プロバイダとして5.3もサポートされているので、何も問題はありません。 (あなたがまだ5.2の場合は、できるだけ早くアップグレードする必要があります。何年も前からサポートされていないし、セキュリティ上の問題もあります)。

    ext/standard/mail.c 
    

    とそこロガーを追加します。あなたは何ができるか

+0

SDCのおかげでsendmail_pathを設定しようとしましたが、mail()関数を呼び出すファイルは教えてくれません。しかし、私はSuhosinを使用しているので、ログ機能を見て、まさに私が必要とするように思われる。ありがとう! – Jose

0

は、このファイルを編集し、PHPのソースコードをダウンロードし、です。

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

これはおそらく、暗黙のうちにあなたのphp関数を呼び出す人をどこからデバッグできるかだけです。

0

mail()をブロックするには、phpのchrootから/ usr/sbin/sendmailを削除して、認証されたsmtpを強制的に削除します。

2

> => PHP 5.3以降。0は、単にあなたのphp.iniであなたのlogilfeの目的の場所へのパスを指定することができます。

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

詳細はPHP docsを参照してください。

関連する問題