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

Интерактивные уроки Flash
Абстрактное искусство
Рисование и закрашивание
Символы и их трансформы
Инженерная графика
Слои
Набор текста
Кнопки
Кадрированная анимация
Экономическая математика
Математический анализ
Применение производных в исследовании функций
Аппарат дифференциальных уравнений в экономике
Элементы линейного программирования
Динамическое программирование
Методика решений задач
по кинематике
Механика жидкостей и газов
Законы постоянного тока
Динамика и законы сохранения
в механике
Методика решения задач
по Электростатике
Основы Flash
Инструменты рисования
Работа с цветом
Импортированная графика
Озвучивание
Работа с объектами
Работа со слоями
Преобразование анимации
Создание анимации
Редактирование анимации
Конвертирование цветовых
моделей
Создание интерактивных
фильмов
Управление Flash Player
Распечатка фильма
Публикация фильма Flash
Публикация HTML
Публикация файлов GIF
Публикация файлов PNG
Форматы экспорта файлов
Windows AVI Реляционная
база данных
Постулаты квантовой механики
Создание карты изображения
Управление макетом страницы
Интерфейс пользователя
Интеллектуальные фрагменты
Учебник по схемотехнике,
альбом схем
Источник питания
охранного устройства
Источник питания для АОНа
Источник бесперебойного
питания
Индикатор
Логические пробники
Схема вольтметра
переменного тока
Помехозащищенная схема
защиты
Транзисторный ограничитель
Стабилизатор напряжения
Таймер
Разрядники
Схема индикатора напряжения
Схема дублирования
Триггерная схема
Методы восстановления
аккумуляторов
Схема зарядного устройства
Схема выпрямителя
Схема индикатора «фазы»
Учебник PHP
Работа со строками
Создание расширений
Работа с переменными
Определение количества
аргументов
Доступ к аргументам
Установка на системах Windows
Область видимости переменной
Куки HTTP
Освобождение ресурсов
PHP-скрипты
Установка на системы UNIX
Возвращаемые функциями
значения
Замена переменных в строках
Безопасный режим
Использование функций
FAQ
Система автоматического
построения
 

Содержание

Мы начнём с создания очень простого расширения, которое первоначально реализует функцию, возвращающую целое число, принятое ей в качестве параметра. В Листинге 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.

E

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

F

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 способна определять, используется ли блок, автоматически освобождать неиспользуемые блоки и блоки с потерянными ссылками и таким образом предотвращать утечки памяти.