- Содержание
Мы начнём с создания очень
простого расширения, которое первоначально реализует функцию, возвращающую целое
число, принятое ей в качестве параметра. В Листинге 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", ¶meter)
== 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.
each
easter_date easter_days
ebcdic2ascii echo
emptyend ereg
ereg_replace eregi
eregi_replace error_log
error_reporting escapeshellarg
escapeshellcmd eval
exec exit exp
explode expm1 extension_loaded
extract ezmlm_hash
fbsql_affected_rows
fbsql_autocommit fbsql_change_user
fbsql_close fbsql_commit
fbsql_connect fbsql_create_blob
fbsql_create_clob fbsql_create_db
fbsql_data_seek fbsql_database
fbsql_database_password fbsql_db_query
fbsql_db_status fbsql_drop_db
fbsql_errno fbsql_error
fbsql_fetch_array fbsql_fetch_assoc
fbsql_fetch_field fbsql_fetch_lengths
fbsql_fetch_object fbsql_fetch_row
fbsql_field_flags fbsql_field_len
fbsql_field_name fbsql_field_seek
fbsql_field_table fbsql_field_type
fbsql_free_result fbsql_get_autostart_info
fbsql_hostname fbsql_insert_id
fbsql_list_dbs fbsql_list_fields
fbsql_list_tables fbsql_next_result
fbsql_num_fields fbsql_num_rows
fbsql_password fbsql_pconnect
fbsql_query fbsql_read_blob
fbsql_read_clob fbsql_result
fbsql_rollback fbsql_select_db
fbsql_set_lob_mode fbsql_set_transaction
fbsql_start_db fbsql_stop_db
fbsql_tablename fbsql_username
fbsql_warnings fclose
fdf_add_template fdf_close
fdf_create fdf_get_file
fdf_get_status fdf_get_value
Поддержка файлов инициализации
В 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, автоматически разрывается старое
соединение и делается попытка установить новое.
- fdf_next_field_name
fdf_open fdf_save
fdf_set_ap fdf_set_encoding
fdf_set_file fdf_set_flags
fdf_set_javascript_action fdf_set_opt
fdf_set_status fdf_set_submit_form_action
fdf_set_value feof
fflush fgetc fgetcsv
fgets fgetss file
file_exists fileatime
filectime filegroup
fileinode filemtime
fileowner fileperms
filepro filepro_fieldcount
filepro_fieldname filepro_fieldtype
filepro_fieldwidth filepro_retrieve
filepro_rowcount filesize
filetype floatval
flock floor flush
fopen fpassthru fputs
fread frenchtojd
fribidi_log2vis fscanf
fseek fsockopen fstat
ftell ftok ftp_cdup
ftp_chdir ftp_close
ftp_connect ftp_delete
ftp_exec ftp_fget
ftp_fput ftp_get
ftp_get_option ftp_login
ftp_mdtm ftp_mkdir
ftp_nlist ftp_pasv
ftp_put ftp_pwd ftp_quit
ftp_rawlist ftp_rename
ftp_rmdir ftp_set_option
ftp_site ftp_size
ftp_systype ftruncate
func_get_arg func_get_args
func_num_args function_exists
fwrite
-
Макросы
Почти для каждой
важной задачи Zend предоставляет предопределённые макросы, которые очень удобны
в использовании. Таблицы и рисунки в последующих разделах описывают основные функции,
структуры и макросы. Определения макросов находятся в основном в файлах zend.h
и zend_API.h.
Мы советуем просмотреть эти файлы после изучения данной
главы. (Хотя вы можете забежать вперёд и прочитать эти файлы прямо сейчас, не
всё будет пока вам понятно.)
Работа с памятью
Менеджмент ресурсов
это ключевой вопрос, особенно в серверных программах. Одним из самых значимых
ресурсов является память, и работа с памятью должна выполняться предельно внимательно.
Менеджмент памяти частично абстрагирован в Zend, и вы должны это учитывать по
очевидным причинам: при абстрагировании, Zend получает полный контроль над всеми
участками памяти. Zend способна определять, используется ли блок, автоматически
освобождать неиспользуемые блоки и блоки с потерянными ссылками и таким образом
предотвращать утечки памяти.
-