Функция PHP Hook - PullRequest
       4

Функция PHP Hook

1 голос
/ 18 февраля 2011

Могу ли я в основном сделать что-то вроде:

register_function_hook('myFunctionHook');

, чтобы при запуске любой функции:

functionA(); //The hook runs myFunctionHook();
anoterFunction(); //The hook runs myFunctionHook();
Class::functionA(); //The hook runs myFunctionHook();

Существует ли такая вещь?Редактировать -

Что я хочу сделать, это получить разбивку по длительности каждой функции.То есть.Настройка производительности.Я хочу получить представление о том, что занимает все время без установки xDebug на моем сервере Apache, однако я не знаю, возможно ли это.

Ответы [ 5 ]

5 голосов
/ 18 февраля 2011

Это возможно с register_tick_function(), также проверьте этот комментарий в руководстве по PHP :

$script_stats = array();
$time = microtime(true);

function track_stats(){
    global $script_stats,$time;
    $trace = debug_backtrace();
    $exe_time = (microtime(true) - $time) * 1000;
    $func_args = implode(", ",$trace[1]["args"]);
    $script_stats[] = array(
        "current_time" => microtime(true),
        "memory" => memory_get_usage(true),
        "file" => $trace[1]["file"].': '.$trace[1]["line"],
        "function" => $trace[1]["function"].'('.$func_args.')',
        "called_by" => $trace[2]["function"].' in '.$trace[2]["file"].': '.$trace[2]["line"],
        "ns" => $exe_time
        );
    $time = microtime(true);
    }

declare(ticks = 1);
register_tick_function("track_stats");

// the rest of your project code

// output $script_stats into a html table or something

Это "перехватывает"ко всему, не только к функциям, но я думаю, что это соответствует вашим целям.

3 голосов
/ 18 февраля 2011

Нет, это невозможно, как вам нравится

Но Вы можете достичь чего-то близкого с наследованием.

 class Vehicle {
       function __construct() {
              $this->hookFunction();
       }

       function hookFunction() {
              //
       }
 }

 class Car extends Vehicle {

 } 

 Class Toyota extends Car {

 }

 new Toyota(); // will you hook function
 // this exclude static call to member functions, or other inline functions.
1 голос
/ 18 февраля 2011

Вместо того, чтобы загрязнять код, вы должны использовать настоящий Профилировщик, такой как тот, который предоставлен xdebug

1 голос
/ 18 февраля 2011

То, что вы ищете, называется профилировщиком. И PQP выглядит как единое целое.

0 голосов
/ 27 апреля 2012

Не уверен, что это нужно для стартера темы, но, возможно, другие могут извлечь из этого пользу.

Существует PHP-библиотека, полностью написанная на PHP, которая позволяет вам делать именно то, что вы хотите.

Вот статья о том, как это работает, включая исходный код: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

Позволяет зарегистрировать функцию из класса, который нужно подключить.Таким образом, он сначала выполняет ваш код, а затем вы определяете, хотите ли вы также вызвать исходную функцию после выполнения кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...