Профессиональное программирование на 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; |
| |
|
В начало ←предыдущая следующая→ ... 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 | ||