Как узнать путь к php.ini
Способы определения пути к php.ini
Как найти основной конфигурационный файл php.ini, используемый интерпретатором PHP?
Наиболее надёжным и универсальным способом является вызов функции phpinfo() из скрипта. Этот метод работает как в CLI, так и в веб-версии PHP.
Пример скрипта для определения пути:
<?php
phpinfo();
?>путь php ini (путь к php.ini)
После запуска скрипта через браузер или консоль (php -f script.php) необходимо найти строку Loaded Configuration File. В этой строке отображается полный путь к загруженному файлу php.ini. Если строка пуста или содержит (none), это означает, что php.ini не загружен (используются значения по умолчанию).
Пример вывода phpinfo (фрагмент):
Loaded Configuration File => /etc/php/8.2/cli/php.ini
Типичная ошибка:
При вызове phpinfo() в веб-окружении путь может отличаться от CLI. Необходимо проверять оба окружения, если используется разная конфигурация.
Как определить путь через командную строку, не создавая файла?
Использование команды php --ini в терминале. Эта команда выводит все загруженные конфигурационные файлы, включая директории сканирования.
php --ini
Пример результата:
Configuration File (php.ini) Path: /etc/php/8.2/cli Loaded Configuration File: /etc/php/8.2/cli/php.ini Scan this dir for additional .ini files: /etc/php/8.2/cli/conf.d Additional .ini files parsed: /etc/php/8.2/cli/conf.d/10-opcache.ini, ...
Метод удобен для быстрой проверки без создания файлов. Команда работает только в режиме CLI (из консоли).
Проблема:
Если установлено несколько версий PHP, необходимо указывать полный путь к исполняемому файлу (/usr/bin/php8.2 --ini).
Как получить путь программно внутри скрипта без вывода всей таблицы phpinfo?
Использование функции php_ini_loaded_file(). Она возвращает строку с путём к загруженному php.ini или false, если файл не загружен.
<?php
$iniPath = php_ini_loaded_file();
if ($iniPath) {
echo "Путь к php.ini: " . $iniPath;
} else {
echo "php.ini не загружен, используются настройки по умолчанию.";
}
?>
Пример вывода:
Путь к php.ini: /etc/php/8.2/cli/php.ini
Дополнительно: функция php_ini_scanned_files() возвращает список дополнительных .ini файлов, просканированных из директории, указанной в Scan this dir.
Ошибка:
Функции php_ini_loaded_file() и php_ini_scanned_files() доступны только в PHP 5.2.4 и выше. В более старых версиях их нет.
Как найти php.ini, если доступ к серверу ограничен и не удаётся запустить скрипт?
Проверка переменных окружения, таких как PHP_INI_SCAN_DIR или PHPRC. Переменная PHPRC задаёт каталог, в котором PHP ищет php.ini (по умолчанию).
echo $PHPRC
# или
getenv('PHPRC')
Также можно использовать команду php -i | grep -i "configuration file" для фильтрации вывода phpinfo() в CLI.
php -i | grep -i "configuration file"
Примечание:
Не все среды устанавливают переменные окружения. Кроме того, PHPRC может быть переопределён в конфигурации веб-сервера (например, в Apache через SetEnv).
Как определить путь для разных ОС и окружений (Windows, Linux, macOS)?
На Windows по умолчанию php.ini располагается в директории интерпретатора PHP (например, C:\PHP\php.ini) или в каталоге Windows (C:\Windows\php.ini). Для точного определения требуется запустить phpinfo() или проверить переменную PHPRC.
На Linux и macOS файл обычно лежит в /etc/php/<версия>/<sapi>/php.ini, где SAPI - cli, apache2, fpm и т.д. Также возможна установка в /usr/local/etc/php.ini (при сборке из исходников).
На macOS Homebrew:
brew info php
# покажет путь, например /usr/local/etc/php/8.2/php.ini
Сложность:
Если установлено несколько версий PHP (например, через разные пакеты), необходимо идентифицировать, какой именно исполняемый файл используется (команда which php).
Расширенные примеры определения пути к php.ini
Пример 1: Скрипт для вывода всей информации о конфигурационных файлах
Следующий скрипт выводит загруженный php.ini, директорию сканирования и список всех дополнительных файлов.
<?php
echo "Loaded Configuration File: " . (php_ini_loaded_file() ?: 'не загружен') . "\n";
echo "Scan directory: " . (ini_get('scan_end') ?: 'по умолчанию') . "\n";
$scanned = php_ini_scanned_files();
if ($scanned) {
echo "Additional .ini files:\n";
foreach (explode(",\n", $scanned) as $file) {
echo " - " . trim($file) . "\n";
}
} else {
echo "Дополнительные .ini файлы не найдены.\n";
}
?>
Результат выполнения (пример):
Loaded Configuration File: /etc/php/8.2/cli/php.ini Scan directory: /etc/php/8.2/cli/conf.d Additional .ini files: - /etc/php/8.2/cli/conf.d/10-opcache.ini - /etc/php/8.2/cli/conf.d/20-xdebug.ini - /etc/php/8.2/cli/conf.d/30-mysqli.ini
Пример 2: Определение пути через переменные окружения в CLI
Использование php -r 'echo php_ini_loaded_file();' в одну строку без создания файла.
php -r 'echo "INI: " . (php_ini_loaded_file() ?? "не загружен") . PHP_EOL;'
INI: /etc/php/8.2/cli/php.ini
Альтернативно с помощью php -i | grep 'Loaded Configuration':
php -i | grep 'Loaded Configuration'
Loaded Configuration File => /etc/php/8.2/cli/php.ini
Пример 3: Сравнение путей для разных SAPI (CLI и веб)
Создадим скрипт, который выводит путь для текущего SAPI и рекомендует проверить другой SAPI.
<?php
$sapi = php_sapi_name();
$iniPath = php_ini_loaded_file();
echo "Текущий SAPI: $sapi\n";
echo "Загруженный php.ini: " . ($iniPath ?: 'не найден') . "\n";
echo "Совет: Для веб-версии (Apache/FPM) проверьте phpinfo() через браузер.\n";
?>
Если запустить этот скрипт из CLI, результат может указать на /etc/php/8.2/cli/php.ini, а при запуске через веб-сервер - на /etc/php/8.2/apache2/php.ini.
Пример 4: Поиск всех php.ini в системе
В Linux можно использовать команду find для поиска всех экземпляров файла, но следует помнить о правах доступа.
sudo find / -name 'php.ini' -type f 2>/dev/null
Результат может выдать:
/etc/php/8.2/cli/php.ini /etc/php/8.2/apache2/php.ini /etc/php/8.2/fpm/php.ini /usr/local/etc/php.ini
Важно: не все найденные файлы могут быть загружены активной версией PHP. Необходимо сопоставить с выводом php --ini для конкретного исполняемого файла.
Пример 5: Использование .user.ini файлов (кэширование на уровне директории)
Начиная с PHP 5.3.0, существует поддержка файлов .user.ini, которые применяются для каждой директории. Их местоположение не заменяет основной php.ini, а дополняет его. Путь к основному файлу всё равно определяется через стандартные методы.
# Проверка, загружен ли .user.ini
php -i | grep 'user_ini.filename'
user_ini.filename => .user.ini
Это означает, что PHP будет искать .user.ini в директории каждого скрипта. Основной php.ini остаётся тем же.