PHP - распознавать, когда была вызвана функция - PullRequest
3 голосов
/ 14 января 2010

Я думаю о том, как найти откуда-нибудь вызванную функцию. Проблема в том, что мне нужно найти, где PHP вызывает функцию mail(). Одним из способов будет использование register_tick_function(), но мне нужно будет открыть каждый файл и проверить, что находится в каждой строке. Проект огромен, для анализа каждого файла в PHP потребуется очень много времени. Любым другим путем? Или вариант как переопределить функцию mail()?

Ответы [ 5 ]

6 голосов
/ 14 января 2010

Чтобы переопределить встроенную почтовую функцию, взгляните на override_function , которая является частью Advanced PHP Debugger PECL extension - тогда вы можете использовать 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);
3 голосов
/ 14 января 2010

Вы можете проверить трассировку стека с помощью debug_backtrace(). Это будет содержать информацию о вызывающем методе / функции среди других. См. Руководство для примеров.

Чтобы добавить поведение в существующую функцию, оберните функцию в свою собственную функцию или класс и затем вызовите ее вместо встроенной функции.

Чтобы полностью переопределить встроенную функцию, вам нужно установить runkit. Тогда вы можете сделать runkit_redefine_function() (или использовать APD, как предложено в другом месте).

Если вы просто хотите знать, где в вашем проекте был вызван mail(), например, вам не нужно оценивать это во время выполнения, используйте функцию поиска вашей IDE. Eclipse, Zend Studio и Netbeans могут выполнять поиск файлов, поэтому поиск вызовов и их замена должны быть очень простыми.

2 голосов
/ 14 января 2010

Подход грубой силы будет заключаться в глобальном поиске и замене в вашем коде, заменив «mail \ s (» на «my_mail (»), затем определите my_mail и поместите туда все необходимые функции ведения журналов.

1 голос
/ 14 января 2010

Почему бы вам просто не найти источник "mail ("?

0 голосов
/ 14 января 2010

Я так понимаю, у вас есть доступ к исходному коду?

Почему бы просто не использовать редактор, такой как jEdit, и найти все вхождения почты (во всех открытых буферах?

Или вам действительно нужно знать номера строк во время выполнения? Я не могу представить, что вы на самом деле делаете.

...