antonio's blog

antonio's blog


Блог о всяком разном, связанном с разработкой ПО. Пишу редко, когда есть время и желание.

Tags


php extensions

Создание PHP расширения

Есть две основные причины для написания расширения для PHP: Необходимо сделать обвязку к системной С/С++ библиотеке, чтобы использовать ее функционал в PHP сценариях Необходимо оптимизировать существующий код написанный на PHP, увеличив его производительность Создадим простое расширение, реализующие три простые функции, доступные в польз…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Ресурсы

Ресурсы в PHP - это специальный, абстрактный тип в котором можно хранить любые пользовательские данные. К таким данным можно отнести дескрипторы файлов, структуры данных, различные хэндлы и т.д. У каждого ресурса есть уникальный идентификатор - простое цело число, которое храниться в структуре zval и используется как индекс внутренней хэш…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Информация о расширении

Для добавления информации о расширении в вывод функции phpinfo() (или php -i в CLI), необходимо определить функцию MINFO с помощью макроса PHP_MINFO_FUNCTION: PHP_MINFO_FUNCTION(ext_name) { ... } Эта функция будет вызвана автоматически при вызове, из пользовательского пространства, функции phpinfo() или при выполнении команды php -i и…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Информация времени выполнения

Часто при разработке расширения требуется получить информацию времени выполнения. К такой информации относиться название исполняемого в данный момент файла, название исполняемого класса, название исполняемой функции, номер исполняемой линии в файле. Для получения этой информации Zend Engine предоставляет несколько функций: char *get_zen…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Вывод информации

Для вывода информации/данных Zend Engine предоставляет несколько функций и макросов: int zend_printf(const char *format, ...) - Функция работает как стандартная функция printf(), за исключением того, что вывод осуществляется в выходной поток по умолчанию, зависящий от режима работы PHP. int ZEND_WRITE(void *buf, uint str_len) - Запис…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Массивы

В PHP массив - это хеш-таблица заключенная в zval контейнер. API хэш-таблиц был рассмотрен в предыдущих постах. Помимо API хэш-таблиц Zend Engine также предоставляет упрощенный API для создания и манипуляции массивами, данный API является оберткой над API хэш-таблиц Рассмотрим примеры создания простого нумерованного и ассоциативного масси…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Хэш-таблицы (HashTables). Часть 4

В данной части будут рассмотрены способы сравнения и сортировки хэш-таблиц. А также освободение ресурсов занимаемых хэш-таблицами Сравнение int zend_hash_minmax(HashTable *ht, compare_func_t compar, int flag, void **pData TSRMLS_DC) - Функция сравнения элементов в хэш-таблице. В функции организуется цикл по элементам хэш-таблицы. Для срав…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Хэш-таблицы (HashTables). Часть 3

В данной части будут рассмотрены способы перебора(итерации) хэш-таблиц. Для перебора элементов хэш-таблиц существует два подхода. Первый - это “ручной” перебор с перемещением указателя позиции, второй - автоматический перебор с применением callback-функций к каждому элементу хэш-таблицы. Итерация с перемещением указателя позиции Для переб…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Хэш-таблицы (HashTables). Часть 2

В данной части будет рассмотрено копирование и объединение хэш-таблиц. Перед тем как приступить к рассмотрению данного вопроса посмотрим на вспомогательную структуру zend_hash_key, объявленую в файле Zend/zend_hash.h: typedef struct _zend_hash_key { char *arKey; /* Ключ для ассоциативного массива */ uint nKeyLength; /* Разме…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Хэш-таблицы (HashTables). Часть 1

Хэш-таблицы являются основным контейнером данных в Zend Engine и активно используются как в Zend Engine, так и в PHP Core. Большинство API функций Zend Engine так или иначе завязаны на хэш таблицы. В хэш-таблицах данные, представленные в виде zval структур, связываются с названием переменной (меткой); в хэш-таблицах хранятся ссылки на: по…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Данные и переменные. Часть 4

Для того чтобы получить данные переменной из пользовательского пространства необходимо осуществить её поиск в одной из таблиц символов . Так как таблица символов представляет из себя хэш-таблицу, то для поиска необходимо использовать функцию zend_hash_find() из семейства API функций работы с хэш-таблицами. int zend_hash_find(HashTable *ht…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Данные и переменные. Часть 3

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

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Данные и переменные. Часть 2

Для получения данных из структуры zval, Zend Engine предоставляет набор макросов. Для получения данных простого, скалярного типа имеются макросы: Z_BVAL, Z_LVAL, Z_DVAL Данные макросы, как не трудно догадаться, используются для получения булевого, целочисленного значения и значения с плавающей запятой. В качестве параметра макросы приним…

Anton DobkinAnton Dobkin

Разработка расширений для PHP. Данные и переменные. Часть 1

PHP - язык c динамической типизацией данных. При динамической типизации данных связывание переменной с ее типом происходит в момент присваивания значения.В переменных PHP можно хранить любые данные, они будут автоматически преобразованы в тот тип, который на данный момент необходим, также в различных участках программы переменной можно пр…

Anton DobkinAnton Dobkin