Вопрос или проблема
Я нашел эту страницу: http://www.php.net/manual/en/configuration.file.php. На моей ОС: Fedora 17, Apache 2.2, PHP 5.4 я искал PHPIniDir в файле httpd.conf. Этой конфигурации не существует.
Как тогда Apache узнает, где находится php.ini? ( /etc/php.ini)
Значения по умолчанию на время компиляции существуют как защитный механизм, когда определенные директивы не указаны. В этом случае модуль PHP “знает”, где искать php.ini, если директива не найдена, потому что он запрограммирован и скомпилирован таким образом.
Именно PHP фактически знает, где находится файл php.ini. Эта информация, скорее всего, включена в модуль PHP для Apache, который либо генерируется выпуском PHP, либо пакет PHP используется во время компиляции Apache.
Я установил Apache и PHP на одном из серверов. Это было сделано предыдущим системным администратором. И Apache, и PHP были скомпилированы из исходников. К тому же, была установлена стандартная версия PHP. Чтобы узнать, какой PHP используется Apache, я выполнил следующую команду
<Install Dir of PHP>/bin/php -i | grep apxs
Она дала мне путь к apache apxs
APACHE_HOME/bin/apxs
Это дало мне информацию о том, какой Apache используется этим PHP. Этот путь и текущая работа apache совпадали. Стандартный PHP выдавал ошибку, когда я набирал
#php -i | grep apxs
Failed loading opcache.so: opcache.so: cannot open shared object file: No such file or directory PHP Warning: PHP Startup: Unable to load dynamic library '<PHP_HOME>/lib/php/extensions/debug-non-zts-20121212/memcached.so' - <PHP_HOME>/lib/php/extensions/debug-non-zts-20121212/memcached.so: undefined symbol: OnUpdateLongGEZero in Unknown on line 0
Таким образом, я смог определить, используется ли PHP Apache. Директория APACHE_HOME/modules/
содержит все модули, libphp5.so
уже присутствовал в APACHE_HOME/modules/
.
Потому что, когда вы устанавливаете или изменяете директорию PHP, вы должны добавить или изменить эти строки:
# PHP8 module
PHPIniDir "C:/php"
LoadModule php_module "C:/php/php8apache2_4.dll"
AddType application/x-httpd-php .php
в httpd.conf.
Ответ или решение
На вопрос о том, как модуль PHP в Apache знает, где находится файл php.ini, можно дать развернутый ответ, учитывая различные уровни настройки и компиляции. Рассмотрим данную тему детально.
Теория
В системе Linux при установке PHP в связке с Apache через пакетный менеджер обычно создаётся определенная иерархия директорий, в которой размещаются файлы конфигурации, бинарные файлы и библиотеки. Важный файл конфигурации php.ini находится как правило в директории /etc/php.ini
. Этот файл используется для задания параметров работы PHP, таких как размеры памяти, включение и настройка расширений и другие конфигурации.
Когда Apache используется в связке с PHP (чаще всего через модуль mod_php), сам PHP должен знать, где искать php.ini, так как именно он использует его для чтения конфигурации при старте приложения.
Из-за особенностей компиляции такие детали, как путь к php.ini, могут быть зашиты в бинарные файлы. Во время компиляции PHP, по умолчанию, путь к файлу php.ini может быть установлен. Если вы попытаетесь скомпилировать PHP самостоятельно, без изменения настроек, он очень вероятно будет использовать стандартные пути.
Пример
Как показывает пример, приведенный в вопросе, на Fedora 17 с Apache 2.2 и PHP 5.4 отсутствие явной директивы PHPIniDir
в httpd.conf
не мешает Apache находить путь до php.ini. Это происходит потому, что информация о местоположении php.ini включена как один из параметров во время компиляции PHP.
Если ваш сервер был установлен предыдущим системным администратором, и он компилировал PHP из исходников, возможно, он использовал флаги конфигурации, которые явно указали Apache (через PHP) путь к php.ini. Как результат, этот путь становится частью исполняемых бинарных файлов.
Применение
Как можно точно определить, какой конфигурационный файл используется?
-
Запустите команду
php -i | grep "Loaded Configuration File"
. Она покажет вам точный путь к текущему файлу php.ini, который используется. -
Если у вас на сервере несколько версий PHP, или PHP был установлен несколько раз, вы можете увидеть различия в путях к php.ini для каждого установленного экземпляра.
-
В Apache можно настроить директиву
PHPIniDir
, которая задает путь к php.ini. На системах Windows это может выглядеть так:PHPIniDir "C:/php" LoadModule php_module "C:/php/php8apache2_4.dll"
-
Проверьте файл httpd.conf на наличие директивы
LoadModule
, которая подключает PHP к Apache, и директивуAddType
, которая связывает расширения файлов с PHP. -
Убедитесь, что в пути к php.ini нет ошибок и что файл существует, чтобы избежать ошибок при запуске.
Эти действия позволяют вам не только определить активный конфигурационный файл, но и при необходимости изменить его настройки, обновляя path в конфигурации Apache.
Таким образом, путь к php.ini в Apache обусловлен не столько самими настройками сервера, сколько действующей конфигурацией и методами компиляции использованными для установки PHP. Это подразумевает гибкость в том случае, если вам необходимо перенастроить работу серверного окружения.