Конфигурация. ============= Интерпретатор PHP имеет модульную структуру - SAPI (http://php.net/install). Модулями SAPI являются расширения каких-либо сервисов. Модулями расширения (extensions) являются модули добавляющие функциональность к модулям SAPI. Все эти модули должны (или могут быть) сконфигурированы независимо друг от друга. Кроме наличия файла конфигурации должна быть возможность независимого добавления модулей расширений (extensions) к каждому из SAPI. Расширения, в свою очередь, должны добавляться без изменения остальной конфигурации. Поэтому для конфигурирования PHP (SAPI модулей) была введена следующая структура каталогов: /etc/php//php.ini /etc/php//php.d/.ini где SAPI - имя модуля; EXTENSION - название расширения. В начале работы SAPI модуль читает основную конфигурацию из файла 'php.ini', находящегося в директории, отведенной для него (/etc/php/). После этого модуль просматривает директорию, содержащую расширения для конфигурационного файла (/etc/php//php.d). ВАЖНО!: Все расширения должны содержать суффикс 'ini', иначе они игнорируются и не добавляются к конфигурации. Сборка модулей. =============== При создании подобной модульной структуры (см. Конфигурация) возникает ряд проблем, связанных с расширениями и SAPI модулями. Первая проблема заключается в том, что возможна (и весьма вероятна) ситуация, когда определенное количество расширений было установлено в систему до того, как был установлен SAPI (еще один) модуль. В этом случае, необходимо включить все расширения для новоустановленого SAPI. Вторая -- это несовместимость некоторых расширений с некоторыми SAPI. Следовательно, определенные расширения не должны быть включены для одних SAPI и выключены для других. Для решения этих проблем был создана следующая структура: 1. /usr/share/php/extconf// - директория, содержащая конфигурацию для данного расширения. 1.1. /usr/share/php/extconf//config - в этом файле должна находится конфигурация php, специфичная для этого модуля (например, в этом файле указывается директива подключения этого модуля "extension=mysql.so"). 1.2. /usr/share/php/extconf//params - здесь находится конфигурация, необходимая для включения данного модуля в разных SAPI: 1.2.1. exceptions - в этой переменной перечисляются SAPI модули, для которых расширение _не_должно_ быть включено. 1.2.2. file_ini - здесь необходимо указать имя конфигурационного файла (например "file_ini=mysql.ini") 2. /usr/share/php//service// -- УСТАРЕЛО -- в этой директории находятся скрипты для перезагрузки конфигурации на сервере, для которого предназначен данный SAPI. Начиная с версии 2.5-alt1 пакета php-base поддержка описанных скриптов прекращена. Для перезагрузки конфигурации сервера следует использовать механизм filetriggers. 3. /usr/share/php/scripts - содержит скрипты для включения/выключения какого-либо расширения. Создание SAPI модуля. ===================== Для более простого создания пакетов SAPI модулей был создан набор rpm макросов. Исходные тексты всех SAPI модулей официально входящих в проект PHP находятся в директории: %php_extsapidir. В SPEC файле SAPI необходимо: 1. Необходимо определить переменную php_sapi. Она определяет название SAPI модуля. Именно это имя будет фигурировать вместо в предыдущих пунктах. 2. Для секций postin/preun необходимо пользоваться специальными макросами %php_sapi_postin , %php_sapi_preun. Эти скрипты производят включение/выключение модулей расширений для данного SAPI. 3. Необходимо создать filetrigger для перезагрузки конфигурации сервиса, обслуживаемого этим SAPI. Также необходим соответствующий %postun скрипт с условием [ $1 = 0 ] для перезагрузки конфигурации сервера в случае удаления данного SAPI. 4. Должны быть созданы директории: 4.1. %php_sysconfdir/%php_sapi - это директория, в которой хранится вся конфигурация php, относящаяся к этому SAPI. В этой директории ищется основной файл конфигурации - php.ini. 4.2. %php_sysconfdir/%name/php.d - в этой директории осуществляется поиск расширений для php.ini. Создание Extension модуля. ========================== Создание модулей расширений во многом похоже на создание SAPI модулей. Исходные тексты всех SAPI модулей, официально входящих в проект PHP, находятся в директории: %php_extsrcdir . В SPEC файле модуля расширения необходимо: 1. Определить переменную %php_extension - это название модуля, которое будет подставлено вместо . 2. Необходимо создать файлы: 2.1. %php_extconf/%php_extension/config 2.2. %php_extconf/%php_extension/params Назначение и содержимое этих файлов было описано выше (см. Сборка модулей). 3. В секциях postin/preun среди всего прочего необходимо добавить макросы %php_extension_postin и %php_extension_preun соответственно. Все rpm макросы описаны в файле %_sysconfdir/rpm/macros.d/php, принадлежащем пакету php-devel. Создание модулей, написанных на PHP. ==================================== Существуют проекты/модули написанные на PHP и расширяющие его функциональность. Такие модули являются платформонезависимыми и для них не требуется компиляция. Для таких модулей была создана следующая система каталогов: /usr/share/php/modules/ /usr/share/php//modules/ Данные директории предназначены для расположения модуля . Первая директория предназначена для модуля не зависящего от версии PHP. Вторая директория для модулей работающих под конкретной версией PHP. Этим директориям соответствуют макросы %php_moddir и %php_vermoddir соответственно.