Есть две основные причины для написания расширения для PHP: Необходимо сделать обвязку к системной С/С++ библиотеке, чтобы использовать ее функционал в PHP сценариях Необходимо оптимизировать существующий код написанный на PHP, увеличив его производительность Создадим простое расширение, реализующие три простые функции, доступные в польз…
antonio
Ресурсы в PHP - это специальный, абстрактный тип в котором можно хранить любые пользовательские данные. К таким данным можно отнести дескрипторы файлов, структуры данных, различные хэндлы и т.д. У каждого ресурса есть уникальный идентификатор - простое цело число, которое храниться в структуре zval и используется как индекс внутренней хэш…
antonio
Для добавления информации о расширении в вывод функции phpinfo() (или php -i в CLI), необходимо определить функцию MINFO с помощью макроса PHP_MINFO_FUNCTION: PHP_MINFO_FUNCTION(ext_name) { ... } Эта функция будет вызвана автоматически при вызове, из пользовательского пространства, функции phpinfo() или при выполнении команды php -i и…
antonio
Часто при разработке расширения требуется получить информацию времени выполнения. К такой информации относиться название исполняемого в данный момент файла, название исполняемого класса, название исполняемой функции, номер исполняемой линии в файле. Для получения этой информации Zend Engine предоставляет несколько функций: char *get_zen…
antonio
Для вывода информации/данных Zend Engine предоставляет несколько функций и макросов: int zend_printf(const char *format, ...) - Функция работает как стандартная функция printf(), за исключением того, что вывод осуществляется в выходной поток по умолчанию, зависящий от режима работы PHP. int ZEND_WRITE(void *buf, uint str_len) - Запис…
antonio
В PHP массив - это хеш-таблица заключенная в zval контейнер. API хэш-таблиц был рассмотрен в предыдущих постах. Помимо API хэш-таблиц Zend Engine также предоставляет упрощенный API для создания и манипуляции массивами, данный API является оберткой над API хэш-таблиц Рассмотрим примеры создания простого нумерованного и ассоциативного масси…
antonio
В данной части будут рассмотрены способы сравнения и сортировки хэш-таблиц. А также освободение ресурсов занимаемых хэш-таблицами Сравнение int zend_hash_minmax(HashTable *ht, compare_func_t compar, int flag, void **pData TSRMLS_DC) - Функция сравнения элементов в хэш-таблице. В функции организуется цикл по элементам хэш-таблицы. Для срав…
antonio
В данной части будут рассмотрены способы перебора(итерации) хэш-таблиц. Для перебора элементов хэш-таблиц существует два подхода. Первый - это “ручной” перебор с перемещением указателя позиции, второй - автоматический перебор с применением callback-функций к каждому элементу хэш-таблицы. Итерация с перемещением указателя позиции Для переб…
antonio
В данной части будет рассмотрено копирование и объединение хэш-таблиц. Перед тем как приступить к рассмотрению данного вопроса посмотрим на вспомогательную структуру zend_hash_key, объявленую в файле Zend/zend_hash.h: typedef struct _zend_hash_key { char *arKey; /* Ключ для ассоциативного массива */ uint nKeyLength; /* Разме…
antonio
Хэш-таблицы являются основным контейнером данных в Zend Engine и активно используются как в Zend Engine, так и в PHP Core. Большинство API функций Zend Engine так или иначе завязаны на хэш таблицы. В хэш-таблицах данные, представленные в виде zval структур, связываются с названием переменной (меткой); в хэш-таблицах хранятся ссылки на: по…
antonio
Для того чтобы получить данные переменной из пользовательского пространства необходимо осуществить её поиск в одной из таблиц символов . Так как таблица символов представляет из себя хэш-таблицу, то для поиска необходимо использовать функцию zend_hash_find() из семейства API функций работы с хэш-таблицами. int zend_hash_find(HashTable *ht…
antonio
Теперь самое время приступить к созданию переменных, которые потом будут доступны в пользовательском пространстве PHP. Процесс создания переменных не сложнее процесса получения данных хранимых в переменных, который был рассмотрен в предыдущих разделах. Процесс создания можно разделить на два этапа. Первый этап подготовка данных переменной…
antonio
Для получения данных из структуры zval, Zend Engine предоставляет набор макросов. Для получения данных простого, скалярного типа имеются макросы: Z_BVAL, Z_LVAL, Z_DVAL Данные макросы, как не трудно догадаться, используются для получения булевого, целочисленного значения и значения с плавающей запятой. В качестве параметра макросы приним…
antonio
PHP - язык c динамической типизацией данных. При динамической типизации данных связывание переменной с ее типом происходит в момент присваивания значения.В переменных PHP можно хранить любые данные, они будут автоматически преобразованы в тот тип, который на данный момент необходим, также в различных участках программы переменной можно пр…
antonio