Php ini scanned files: примеры (PHP)

Использование php_ini_scanned_files для работы с конфигурационными файлами
Раздел: Конфигурация PHP
php_ini_scanned_files: string|false

Описание функции php_ini_scanned_files

Функция php_ini_scanned_files возвращает список дополнительных ini-файлов, которые были обработаны после основного файла конфигурации php.ini. Данная функция применяется для получения информации о расположении и количестве дополнительных конфигурационных файлов, которые загружаются из директории, указанной в параметре конфигурации --with-config-file-scan-dir во время компиляции PHP.

Аргументы функции

Функция принимает один необязательный аргумент:

  • $separator (string) - разделитель, который будет использоваться между именами файлов. По умолчанию используется запятая (,).

Если параметр не задан, имена файлов будут разделены запятыми. При указании строки-разделителя, имена файлов будут объединены в строку с использованием этого разделителя.

Базовые примеры использования

Пример 1: Использование с разделителем по умолчанию
<?php
$files = php_ini_scanned_files();
echo $files;
?>
/etc/php/8.2/cli/conf.d/20-opcache.ini,/etc/php/8.2/cli/conf.d/10-mysqlnd.ini
Пример 2: Использование с указанным разделителем
<?php
$files = php_ini_scanned_files("\n");
echo "Сканированные файлы:\n" . $files;
?>
Сканированные файлы:
/etc/php/8.2/cli/conf.d/20-opcache.ini
/etc/php/8.2/cli/conf.d/10-mysqlnd.ini
Пример 3: Обработка пустого результата
<?php
$files = php_ini_scanned_files();
if (empty($files)) {
    echo "Дополнительные конфигурационные файлы не найдены.";
}
?>
Дополнительные конфигурационные файлы не найдены.

Похожие функции в PHP

Возвращает путь к основному загруженному файлу php.ini. Используется, когда требуется узнать расположение основного конфигурационного файла, а не дополнительных.

Возвращает все зарегистрированные конфигурационные настройки. Применяется для получения значений всех директив, а не списка файлов. Удобна для отладки и анализа текущих настроек PHP.

get_loaded_extensions

Возвращает массив с именами всех загруженных модулей. Может быть полезной в связке с php_ini_scanned_files для анализа конфигурации расширений.

Альтернативы в других языках программирования

Php ini scanned files в Python

В Python для работы с конфигурационными файлами используется модуль configparser. Аналога функции php_ini_scanned_files не существует, так как Python не использует механизм сканирования директорий для конфигурационных файлов.

import configparser
config = configparser.ConfigParser()
config.read('config.ini')
print(config.sections())
['section1', 'section2']
JavaScript (Node.js)

В Node.js конфигурация обычно загружается из файлов .json или .env. Для загрузки нескольких конфигурационных файлов можно использовать модуль dotenv или config.

const fs = require('fs');
const files = fs.readdirSync('/etc/app/config.d/');
console.log(files.filter(f => f.endsWith('.conf')));
['db.conf', 'app.conf']

Php ini scanned files в MySQL

MySQL использует параметр командной строки --defaults-extra-file для указания дополнительных конфигурационных файлов. Для получения списка загруженных конфигурационных файлов можно выполнить запрос SHOW VARIABLES.

SHOW VARIABLES LIKE 'config_file';
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| config_file   | /etc/mysql/my.cnf   |
+---------------+---------------------+

Типичные ошибки при использовании

Ошибка 1: Неверная интерпретация возвращаемого значения

Функция возвращает строку, а не массив. Для работы с отдельными файлами необходимо разбить строку.

<?php
$files = php_ini_scanned_files();
// Ошибочный подход
foreach ($files as $file) {
    echo $file;
}
?>
Warning: Invalid argument supplied for foreach()
Ошибка 2: Использование в окружении без дополнительных конфигурационных файлов

Если директория для сканирования не настроена, функция вернет пустую строку.

<?php
$files = php_ini_scanned_files(",");
$fileArray = explode(",", $files);
echo count($fileArray);
?>
1

Даже при пустом результате explode создаст массив с одним элементом - пустой строкой.

Изменения в последних версиях PHP

Начиная с PHP 8.0, функция php_ini_scanned_files не претерпела значительных изменений в поведении или синтаксисе. Однако в PHP 8.1 были улучшены сообщения об ошибках для функций работы с конфигурацией. В PHP 8.2 не было внесено изменений, затрагивающих данную функцию.

Важное замечание: в PHP 7.4 и более ранних версиях функция могла возвращать FALSE в случае ошибки, но в PHP 8.0 и выше функция всегда возвращает строку.

Расширенные примеры использования

Пример 1: Получение массива конфигурационных файлов
Пример php
<?php
function getScannedIniFiles() {
    $files = php_ini_scanned_files();
    if (empty($files)) {
        return [];
    }
    return explode(",", $files);
}

$iniFiles = getScannedIniFiles();
print_r($iniFiles);
?>
Array
(
    [0] => /etc/php/8.2/cli/conf.d/20-opcache.ini
    [1] => /etc/php/8.2/cli/conf.d/10-mysqlnd.ini
)
Пример 2: Проверка наличия конкретного расширения
Пример php
<?php
function isExtensionConfigured($extensionName) {
    $files = php_ini_scanned_files();
    if (empty($files)) {
        return false;
    }
    $filesArray = explode(",", $files);
    foreach ($filesArray as $file) {
        if (strpos($file, $extensionName) !== false) {
            return true;
        }
    }
    return false;
}

echo isExtensionConfigured('opcache') ? 'Расширение найдено' : 'Расширение отсутствует';
?>
Расширение найдено
Пример 3: Анализ конфигурационных файлов
Пример php
<?php
$files = php_ini_scanned_files(",");
if (!empty($files)) {
    $fileList = explode(",", $files);
    foreach ($fileList as $file) {
        $file = trim($file);
        if (file_exists($file)) {
            $size = filesize($file);
            echo "Файл: $file, Размер: {$size} байт<br>";
        }
    }
}
?>
Файл: /etc/php/8.2/cli/conf.d/20-opcache.ini, Размер: 245 байт
Файл: /etc/php/8.2/cli/conf.d/10-mysqlnd.ini, Размер: 150 байт
Пример 4: Интеграция с phpinfo
Пример php
<?php
function getScannedFilesInfo() {
    $files = php_ini_scanned_files("\n");
    if (empty($files)) {
        return "Нет дополнительных конфигурационных файлов.";
    }
    return "Сканированные файлы:\n" . $files;
}

ob_start();
phpinfo();
$phpinfo = ob_get_clean();

echo getScannedFilesInfo();
?>
Сканированные файлы:
/etc/php/8.2/cli/conf.d/20-opcache.ini
/etc/php/8.2/cli/conf.d/10-mysqlnd.ini

PHP php_ini_scanned_files function comments

En
Php ini scanned files Return a list of .ini files parsed from the additional ini dir