Профессиональное программирование на PHP

Страница 578 из 591


598 Глава 23 Написание SAPI-интерфейсов и расширение Zend Engine

char *fname = NULL; fname =

apd_get_active_function_name(EG(current_execute_data)->op_array TSRMLS_CC);

trace_function_entry(fname, ZEND_INTERNAL_FUNCTION,

zend_get_executed_filename(TSRMLS_C) , zend_get_executed_l ineno (TSRMLS_C)) ;

execute_internal(execute_data_ptr, return_value_used TSRMLS_CC);

trace_function_exit(fname);

efree(fname);

}

Обе эти функции реализуют одну и ту же базовую логику. Во-первых, для идентификации имени выполняемой функции они используют вспомогательную функцию apd_get_active_function_name (). Во-вторых, они вызывают APD-функцию trace_function_entry (). Она, в свою очередь, вызывает механизм протоколирования APD для записи входа в функцию, включая файл и номер строки, где произошел вызов функции.

Затем APD использует стандартную PHP-функцию выполнения для вызова переданной функции. После того как обращение к функции завершается и возвращается управление, APD вызывает функцию trace_function_exit (). Функция использует механизм протоколирования APD для фиксации завершения вызова функции. Этот метод также записывает время, истекшее с момента последнего вызова функции. Таким образом, APD накапливает необходимую для профилирования информацию.

Теперь читатель знает, как работает расширение APD. Все остальное, как говорит ся, детали.

АРС

Программа АРС несколько сложнее, хотя и придерживается той же модели, что и APD. Базовая функциональность АРС заключается в переназначении функции zend_compile_f ile () альтернативной функцией, которая способна переопределять, сохранять и извлекать результирующий операционный массив zend_op_array в общей кэш-памяти.

Использование обратных вызовов Zend-расширений

Zend-расширение аналогично обычному расширению, за исключением того, что реализует следующую определяющую структуру

struct _zend_extension { char *name; char *version; char *author; char *URL; char *copyright; startup_func_t startup; shutdown_func_t shutdown; activate_func_t activate; deactivate_func_t deactivate; message_handler_func_t message_handler;




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006