Все лгут

Вчера наткнулся на недокументированные функции Loader, сегодня набрёл на давний пост на форуме ionCube, где Nick Lindridge (гендиректор ionCube Ltd или кто-то в этом духе) рассказывал интересующемуся пользователю, что функции _dyuweyrj4() и _dyuweyrj4r() при вызове возвращают «жемчужины мудрости». Далее »

Автор: , опубликовано в: Zend, Безопасность, комментариев: 2
28
Окт
2010

Создание пользовательских классов из расширений PHP

Задача: нужно создать класс из расширения , при этом созданный класс должен быть виден только в пределах выполнения одного запроса. При этом должно поддерживаться наследование классов, реализация интерфейсов, а также автоматическая загрузка классов (spl_autoload_register/__autoload).

Зачем это нужно: /Zend обычно гораздо быстрее PHP-кода. Капитан Очевидность не может не заметить, что вынесение критичных по быстродействию и потреблению памяти участков кода в расширение PHP позволяет снизить объём потребляемой памяти («родные» типы данных языка C компактнее zval) и увеличить быстродействие (машинный код выполняется явно быстрее интерпретируемого).

Поддержка автоматической загрузки полезна, если, например, используется фреймворк наподобие Kohana, позволяющий расширять функциональность системных классов без изменения их кода (что достигается благодаря использованию каскадной файловой системы). Далее »

Автор: , опубликовано в: Zend, комментариев: 3
5
Окт
2010

Простой DoS для PHP

Копался сегодня во внутренностях , и обнаружил такую вещь: функция zend_hash_sort() (она вызывается из функций типа usort() и прочих) сортирует не сам массив (в терминах ), а массив (в терминах языка C) указателей на элементы массива (в терминах ), а потом по отсортированному C-массиву пересоздаёт PHP-массив. Далее »

Автор: , опубликовано в: PHP, Безопасность, комментариев: 3
19
Окт
2009

Оптимизация байт-кода в PHP

Я давно задавался вопросом, насколько «умным» является интерпретатор в том, что касается оптимизации. В частности, меня всегда интересовала поддержка исключения неиспользуемого кода (известная как dead code elimination) и распространение константных значений (constant propagation). И теперь, когда я вплотную занялся изучением внутренностей , у меня такая возможность появилась. Далее »

Автор: , опубликовано в: PHP, комментариев: 2
15
Сен
2009

Последовательность инициализации и сброса в расширениях PHP

Я сейчас занимаюсь написанием , которое меняет UID/EUID (а также GID/EGID) процесса -интерпретатора на UID/GID владельца DocumentRoot сайта. При этом по замыслу расширение должно отключаться, если SAPI не используется (например, запущена CLI-версия интерпретатора).

Для этой задачи оказалось важным знать точную последовательность инициализации и финализации. Далее »

Автор: , опубликовано в: C/C++, PHP, комментариев: нет
29
Авг
2009

PHP: зависимости времени выполнения между расширениями

Так (как, кстати, рекомендует Sara Golemon) нельзя:

[-]
View Code C
#if ZEND_MODULE_API_NO >= 220050617
static zend_module_dep php_afs_depencies[] ={
    ZEND_MODULE_REQUIRED("krb5");
    {NULL,NULL,NULL}
}
#endif

Потому что даже не скомпилируется, если с ZEND_MODULE_API_NO (не) повезёт. Далее »

Автор: , опубликовано в: C/C++, комментариев: нет
13
Май
2009

О пользе избыточной инициализации, или, В исходный код смотреть вредно

То, что данные нужно инициализировать перед использованием, знают все. Но иногда правильная инициализация — хитрая штука. Я с этим столкнулся, когда писал расширение для , работающее с Voxel Hosting API.

Одна из проблем PHP — плохая документация (отсутствие таковой) по внутреннему API. А из кода не всегда всё однозначно ясно, чо временами приводит к очень милым ошибкам вида «фиг ты меня найдешь» (смягчено из соображений цензуры).

Об одной из таких особенностей я хочу рассказать. Далее »

Автор: , опубликовано в: C/C++, комментариев: нет
7
Май
2009