関数が呼び出された場所を見つける方法を考えています。問題は、PHPがmail()
関数を呼び出している場所を見つける必要があることです。1つの方法はを使用することregister_tick_function()
ですが、各ファイルを開いて、各行の内容を確認する必要があります。プロジェクトは巨大で、PHPで各ファイルを解析するのに非常に長い時間がかかります。その他の方法で?mail()
または、関数をオーバーライドする方法を選択しますか?
5 に答える
組み込みのメール関数をオーバーライドするには、 Advanced PHP Debugger PECL拡張機能の一部であるoverride_functionを確認してください。次に、 debug_backtraceを使用 して呼び出し元の詳細を確認できます...
//define code to override mail function (note I've used php5.3 nowdoc syntax to avoid
//the need to escape the dollar symbols!!
$code=<<<'CODE'
$trace=debug_backtrace();
$caller=array_shift($trace);
echo 'mail() called by '.$caller['function']
if (isset($caller['class']))
echo 'in '.$caller['class'];
CODE;
//install override
override_function('mail', '$to,$subject,$msg,$hdrs,$params', $code);
でスタックトレースを調べることができますdebug_backtrace()
。これには、特に呼び出し元のメソッド/関数に関する情報が含まれます。例については、マニュアルを参照してください。
既存の関数に動作を追加するには、関数を独自の関数またはクラスにラップしてから、ネイティブ関数の代わりにこれを呼び出します。
ネイティブ関数を完全に再定義するには、をインストールする必要がありますrunkit
。次に、実行できますrunkit_redefine_function()
(または、他の場所で提案されているようにAPDを使用します)。
プロジェクトのどこで呼び出されたかを知りたいだけの場合mail()
、たとえば実行時にこれを評価する必要がない場合は、IDEの検索機能を使用します。Eclipse、Zend Studio、およびNetbeansはファイル検索を実行できるため、呼び出しを見つけて置き換えるのも非常に簡単です。
総当たり攻撃のアプローチは、グローバル検索を実行してコードを置き換え、「mail \ s(」を「my_mail(」に置き換えてから、my_mailを定義し、必要なログ機能をそこに配置することです。
ソースで「mail(」を検索してみませんか?
ソースコードにアクセスできると思いますか?
jEditのようなエディターを使用して、開いているすべてのバッファーですべてのmail(*)を検索してみませんか?
それとも、実行時に行番号を本当に知る必要がありますか?あなたが実際にそうしているとは想像できません。