Профессиональное программирование на PHP

Страница 488 из 591


506 Глава 21 Расширение РНР: часть I

Она заставляет систему сборки РНР обработать файл conf ig. m4 и создает из этого файла конфигурационный сценарий.

Затем расширение конфигурируется и компилируется:

> ./configure --enable-example

> make

> make install

Эти команды компилируют и устанавливают расширение в каталоге общих расширений. Так как в данном случае собиралось динамическое расширение, его следует включить в файле php .ini, используя следующую директиву:

extension=example.so

Если не загрузить расширение с помощью php. ini, то его потребуется загружать во время выполнения сценария с помощью следующего кода:

dl("example.so");

Модули, загружаемые во время выполнения, выгружаются после завершения запроса. Эти операции медленные, поэтому их следует использовать, только если загрузка с помощью php. ini файла невозможна. Если неизвестно, загружается ли расширение из php. ini, то обычно используется следующий блок кода для определения того, загружено ли необходимое расширение, и его загрузки, если это не так.

if(!extension_loaded('example 1)) {

dl(1 example.' . php shlib suffix);

}

Использование функций

Одной из самых распространенных задач при создании расширений является написание функций. Независимо от цели создания расширения — рефакторинга существующего PHP-кода в С-код или создания оболочки С-библиотеки для использования в РНР — функции пишутся всегда.

Пример функции

Рассмотрим создание функции, вычисляющей последовательность Фибоначчи. Прежде всего требуется С-функция способная рассчитывать числа Фибоначчи. В главе 11, "Повторное использование вычислений", рассматривается несколько реализаций подобной функции на РНР. Версия с хвостовой рекурсией работает очень быстро. Ниже приведена прямая С-реализация PHP-функции с вспомогательной хвостовой рекурсией.

int fib auxfint n, int next, int result) {

if(n == 0) { return result;

}

return fib aux(n - 1, next + result, next);

}




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006