Как модуль Apache PHP узнает, где находится файл php.ini?

Вопрос или проблема

Я нашел эту страницу: 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. Как результат, этот путь становится частью исполняемых бинарных файлов.

Применение

Как можно точно определить, какой конфигурационный файл используется?

  1. Запустите команду php -i | grep "Loaded Configuration File". Она покажет вам точный путь к текущему файлу php.ini, который используется.

  2. Если у вас на сервере несколько версий PHP, или PHP был установлен несколько раз, вы можете увидеть различия в путях к php.ini для каждого установленного экземпляра.

  3. В Apache можно настроить директиву PHPIniDir, которая задает путь к php.ini. На системах Windows это может выглядеть так:

    PHPIniDir "C:/php"
    LoadModule php_module "C:/php/php8apache2_4.dll"
  4. Проверьте файл httpd.conf на наличие директивы LoadModule, которая подключает PHP к Apache, и директиву AddType, которая связывает расширения файлов с PHP.

  5. Убедитесь, что в пути к php.ini нет ошибок и что файл существует, чтобы избежать ошибок при запуске.

Эти действия позволяют вам не только определить активный конфигурационный файл, но и при необходимости изменить его настройки, обновляя path в конфигурации Apache.

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

Оцените материал
Добавить комментарий

Капча загружается...