Создание расширений Учебник PHP

Содержание

Мы начнём с создания очень простого расширения, которое первоначально реализует функцию, возвращающую целое число, принятое ей в качестве параметра. В Листинге 9.3 дан исходник. Успенский собор

Рисунок 29-1. Листинг 9.3. Простое расширение.
/* включить/include стандартный header */ #include "php.h" /* объявление 
экспортируемой функции */ ZEND_FUNCTION(first_module); /* скомпилированный список 
функций, так что Zend знает, что находится в этом модуле */ zend_function_entry 
firstmod_functions[] = { ZEND_FE(first_module, NULL) {NULL, NULL, NULL} }; /* 
скомпилированная информация модуля */ zend_module_entry firstmod_module_entry 
= { STANDARD_MODULE_HEADER, "First Module", firstmod_functions, NULL, NULL, NULL, 
NULL, NULL, NO_VERSION_YET, STANDARD_MODULE_PROPERTIES }; /* реализуется стандартная 
"заглушка/stub" для введения в Zend */ #if COMPILE_DL_FIRST_MODULE ZEND_GET_MODULE(firstmod) 
#endif /* реализуется функция, которая должна стать доступной для PHP */ ZEND_FUNCTION(first_module) 
{ long parameter; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &parameter) 
== FAILURE) { return; } RETURN_LONG(parmeter); }

В этом коде содержится завершённый PHP-модуль. Мы коротко разъясним исходный код в деталях, но сначала необходимо обсудить процесс построения/build. (Это даст возможность самым нетерпеливым поэкспериментировать, прежде чем мы углубимся в дискуссию об API.) Аналого-цифровое преобразование на основе спектрального анализа

Компиляция модулей

Существуют три основных способа компиляции модулей:

  • Использовать предоставляемый "make"-механизм в директории dl. Сопротивление материалов Деформации при кручении Кручение круглого бруса происходит при нагружении его парами сил с моментами в плоскостях, перпендикулярных продольной оси. При этом образующие бруса искривляются и разворачиваются на угол γ называемый углом сдвига (угол поворота образующей Поперечные сечения разворачиваются на угол ip, называемый углом закручивания

  • Использовать предоставляемый "make"-механизм в директории ext, что позволяет также строить динамически загружаемые модули.

  • Компилировать исходник вручную. Собор Святой Софии в Киеве Новый этап в истории зодчества Киевской Руси связан со строительством Ярослава Мудрого в стольном граде Киеве. В конце 30-х — начале 50-х гг. XI столетия по указанию великого князя киевского был возведён самый величественный и знаменитый из всех русских храмов — собор Святой Софии (что значит Премудрости Божьей). Впрочем, это и самый грандиозный из всех известных в наше время соборов византийской художественной традиции.

Предпочтителен второй метод, так как в PHP 4.0 он стал стандартизованным сложным процессом построения. Такое усложнение имеет также, к сожалению, и недостатки, - в нём трудно разобраться. Для этого далее в этой главе будет дано развёрнутое объяснение, но пока поработаем с файлами по умолчанию.

Процесс make, содержащийся в директории dl, это не очень чистый вариант, планируемый на удаление из исходного дерева. Откровенно говоря, намного проще использовать построение динамических расширений, но, поскольку здесь нет возможностей директории ext и она в любом случае намечена к удалению, использование директории dl не рекомендуется.

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

Компиляция с использованием Make. Для компилирования исходников с использованием стандартного механизма скопируйте всех субдиректории в директорию ext вашего исходного дерева PHP. Затем запустите buildconf, который создаст новый скрипт configure, содержащий необходимые опции. По умолчанию все сэмплы исходников отключены/disabled, поэтому вы можете не бояться прерывания вашего процесса построения.

После запуска buildconf, configure --help покажет следующие дополнительные модули:
 --enable-array_experiments 
BOOK: Enables array experiments --enable-call_userland BOOK: Enables userland 
module --enable-cross_conversion BOOK: Enables cross-conversion module --enable-first_module 
BOOK: Enables first module --enable-infoprint BOOK: Enables infoprint module --enable-reference_test 
BOOK: Enables reference test module --enable-resource_test BOOK: Enables resource 
test module --enable-variable_creation BOOK: Enables variable-creation module

Модуль, показанный ранее в Листинге 9.3, может быть включён с помощью --enable-first_module или --enable-first_module=yes.

Поддержка файлов инициализации

В PHP 4 имеется переработанная поддержка файлов инициализации. Теперь можно специфицировать вхождения инициализации по умолчанию непосредственно в вашем коде, читать и изменять эти значения на этапе прогона/runtime и создавать обработчики сообщений для изменения уведомления.

При создании раздела .ini в вашем собственном модуле используйте макрос PHP_INI_BEGIN() для маркировки начала такого раздела и макрос PHP_INI_END() - для маркировки его конца. Между ними вы можете использовать PHP_INI_ENTRY() для создания вхождений.
PHP_INI_BEGIN() 
PHP_INI_ENTRY("first_ini_entry", "has_string_value", PHP_INI_ALL, NULL) PHP_INI_ENTRY("second_ini_entry", 
"2", PHP_INI_SYSTEM, OnChangeSecond) PHP_INI_ENTRY("third_ini_entry", "xyz", PHP_INI_USER, 
NULL) PHP_INI_END()

Макрос PHP_INI_ENTRY() принимает 4 параметра: имя вхождения/entry name, значение вхождения/entry value, изменение прав доступа и указатель на обработчик изменения уведомления. Имя и значение вхождения обязаны быть специфицированы как строки, независимо от того, являются они в действительности строками или целыми числами.

Права доступа сгруппированы в три раздела: PHP_INI_SYSTEM позволяет вносить изменения только непосредственно в файле php3.ini; PHP_INI_USER позволяет пользователю переопределять изменения на этапе прогона с использованием дополнительных файлов конфигурации, таких как .htaccess;
а PHP_INI_ALL позволяет делать изменения без ограничений.
Имеется также четвёртый уровень, PHP_INI_PERDIR, поведение которого ещё не проверено.

Четвёртый параметр состоит из указателя на обработчик change-notification/изменения уведомления. При изменении любого из этих вхождений вызывается этот обработчик. Такой обработчик может быть объявлен с использованием макроса PHP_INI_MH:
PHP_INI_MH(OnChangeSecond); // обработчик для ini-entry "second_ini_entry" 
// специфицируйте здесь ini-entries PHP_INI_MH(OnChangeSecond) { zend_printf("Message 
caught, our ini entry has been changed to %s<br>", new_value); return(SUCCESS); 
}

Новое значение даётся обработчику изменения как строка в переменной new_value. Если посмотреть на определение PHP_INI_MH, вы увидите, что должны использовать небольшое количество параметров:

#define PHP_INI_MH(name) int name(php_ini_entry *entry, char *new_value, 
uint new_value_length, void *mh_arg1, void *mh_arg2, void *mh_arg3)

Все эти определения можно найти в php_ini.h. Ваш обработчик сообщений будет иметь доступ к структуре, которая содержит полное вхождение, новое значение, его длину и три необязательных аргумента. Эти необязательные аргументы можно специфицировать дополнительным макросом PHP_INI_ENTRY1 (допускающим один дополнительный аргумент), PHP_INI_ENTRY2 (допускающим два дополнительных аргумента) и PHP_INI_ENTRY3 (допускающим три дополнительных аргумента).

Обработчики change-notification должны использоваться при кэширования вхождений инициализации для быстрого доступа или для выполнения определённых задач, которые необходимы при изменении значения. Например, если модулю необходимо постоянное соединение с определённым хостом и кто-то изменяет hostname, автоматически разрывается старое соединение и делается попытка установить новое.

 

Макросы

Почти для каждой важной задачи Zend предоставляет предопределённые макросы, которые очень удобны в использовании. Таблицы и рисунки в последующих разделах описывают основные функции, структуры и макросы. Определения макросов находятся в основном в файлах zend.h и zend_API.h.
Мы советуем просмотреть эти файлы после изучения данной главы. (Хотя вы можете забежать вперёд и прочитать эти файлы прямо сейчас, не всё будет пока вам понятно.)

Работа с памятью

Менеджмент ресурсов это ключевой вопрос, особенно в серверных программах. Одним из самых значимых ресурсов является память, и работа с памятью должна выполняться предельно внимательно. Менеджмент памяти частично абстрагирован в Zend, и вы должны это учитывать по очевидным причинам: при абстрагировании, Zend получает полный контроль над всеми участками памяти. Zend способна определять, используется ли блок, автоматически освобождать неиспользуемые блоки и блоки с потерянными ссылками и таким образом предотвращать утечки памяти.

Математика решение задач