Get loaded extensions: примеры (PHP)

Функция get_loaded_extensions в PHP: от основ до продвинутых примеров
Раздел: Расширения PHP
get_loaded_extensions(bool $zend_extensions = false): array

Основы функции get_loaded_extensions

Назначение и применение

Функция get_loaded_extensions возвращает массив имён всех скомпилированных и загруженных модулей в текущей среде выполнения PHP. Эта информация полезна при отладке, анализе конфигурации сервера, проверке доступности определённых расширений перед использованием их функций.

Синтаксис и параметры
array get_loaded_extensions([ bool $zend_extensions = false ])

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

  • $zend_extensions (bool, необязательный, по умолчанию false): Если установлено в true, функция возвращает список Zend-расширений. В противном случае возвращаются обычные расширения PHP.

Возвращаемое значение — индексированный массив строк.

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

Получение списка всех расширений

Простейший вызов функции без аргументов.

<?php
$extensions = get_loaded_extensions();
print_r($extensions);
?>
Array
(
    [0] => Core
    [1] => date
    [2] => libxml
    [3] => openssl
    [4] => pcre
    [5] => sqlite3
    [6] => zlib
    [7] => ctype
    ...
)
Запрос списка Zend-расширений
<?php
$zend_ext = get_loaded_extensions(true);
echo "Zend расширения: " . implode(', ', $zend_ext);
?>
Zend расширения: Xdebug, Zend OPcache
Проверка наличия конкретного расширения
<?php
if (in_array('json', get_loaded_extensions())) {
    echo "Расширение JSON доступно.";
} else {
    echo "Расширение JSON отсутствует.";
}
?>
Расширение JSON доступно.

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

Проверяет, загружено ли конкретное расширение. Более эффективна для проверки одного модуля, чем get_loaded_extensions с in_array.

if (extension_loaded('mysqli')) { /* ... */ }
phpinfo

Выводит обширную информацию о конфигурации PHP, включая все расширения. get_loaded_extensions даёт только массив имён, что удобно для программной обработки.

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

$json_funcs = get_extension_funcs('json'); // ['json_encode', ...]

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

Python (sys.modules, pkgutil)

В Python нет прямой аналогии, но информацию о модулях можно получить через sys.modules или pkgutil.

import sys
print(list(sys.modules.keys())[:5])
['sys', 'builtins', '_frozen_importlib', ...]
JavaScript (Node.js)

В Node.js загруженные модули находятся в объекте require.cache.

console.log(Object.keys(require.cache));
['/path/to/module.js', ...]
MySQL (SHOW PLUGINS)

Для просмотра загруженных плагинов/расширений используется SQL-запрос.

SHOW PLUGINS;
+----------------+----------+-------------------+
| Name           | Status   | Library           |
+----------------+----------+-------------------+

Основное отличие PHP-функции — она возвращает данные в виде массива, готового для использования в коде, а не для визуального вывода.

Типичные ошибки и особенности

Ожидание булевого параметра

Передача параметров других типов может привести к неожиданному поведению из-за неявного приведения типов в PHP.

// Неявное приведение строки к bool
$result = get_loaded_extensions('true'); // Строка 'true' преобразуется в true
print_r($result); // Вернёт Zend-расширения
Некорректная обработка вывода для Zend-расширений

Если Zend-расширений нет, функция вернёт пустой массив, а не false или null.

$zend = get_loaded_extensions(true);
if (empty($zend)) {
    echo "Zend-расширения не обнаружены.";
}
Предположение о порядке элементов в массиве

Порядок расширений в возвращаемом массиве не гарантирован и может меняться между версиями PHP или конфигурациями.

// Ненадёжный код
$ext = get_loaded_extensions();
$firstExt = $ext[0]; // 'Core' сейчас, но не обязательно в будущем

История изменений функции

Функция get_loaded_extensions остаётся стабильной на протяжении многих версий PHP. Ключевое изменение произошло в PHP 5.3.0, когда был добавлен необязательный параметр $zend_extensions для разделения вывода обычных и Zend-расширений.

В версиях PHP 8.x поведение функции не претерпело значительных изменений. Однако в PHP 8.0 усилилась строгость типов, поэтому передача явно небулевых значений может генерировать предупреждения в строгом режиме.

// В PHP 8 с strict_types=1
declare(strict_types=1);
get_loaded_extensions(1); // int 1 - корректен из-за неявного приведения

Расширенные примеры применения

Сравнение расширений между двумя конфигурациями

Сценарий для анализа различий в окружениях.

Пример php
$local_ext = ['json', 'mysqlnd', 'curl'];
$server_ext = get_loaded_extensions();
$missing = array_diff($local_ext, $server_ext);
if (!empty($missing)) {
    echo "Отсутствующие расширения: " . implode(', ', $missing);
} else {
    echo "Все необходимые расширения загружены.";
}
Группировка расширений по первой букве
Пример php
$extensions = get_loaded_extensions();
$grouped = [];
foreach ($extensions as $ext) {
    $firstLetter = strtoupper($ext[0]);
    $grouped[$firstLetter][] = $ext;
}
ksort($grouped);
print_r($grouped);
Array
(
    [C] => Array ( [0] => Core [1] => ctype ... )
    [D] => Array ( [0] => date )
    ...
)
Создание отчёта о расширениях с детализацией
Пример php
echo "<h3>Отчёт о расширениях PHP</h3>";
$all_ext = get_loaded_extensions();
$zend_ext = get_loaded_extensions(true);
$regular_ext = array_diff($all_ext, $zend_ext);
echo "Всего расширений: " . count($all_ext) . "<br>";
echo "Обычных расширений: " . count($regular_ext) . "<br>";
echo "Zend-расширений: " . count($zend_ext) . "<br>";
echo "<br>Список Zend-расширений:<br>";
foreach ($zend_ext as $ext) {
    echo "- $ext<br>";
}
Интеграция с классом для проверки зависимостей
Пример php
class ExtensionChecker {
    private $loaded;
    public function __construct() {
        $this->loaded = get_loaded_extensions();
    }
    public function isAvailable($ext_name): bool {
        return in_array($ext_name, $this->loaded, true);
    }
    public function getMissing(array $required): array {
        return array_diff($required, $this->loaded);
    }
}
$checker = new ExtensionChecker();
if (!$checker->isAvailable('gd')) {
    echo "Расширение GD необходимо для обработки изображений.";
}
Фильтрация расширений по шаблону имени
Пример php
$extensions = get_loaded_extensions();
// Поиск расширений, содержащих 'xml'
$xml_ext = preg_grep('/xml/i', $extensions);
print_r($xml_ext);
Array
(
    [2] => libxml
    [10] => xml
    [11] => xmlreader
    [12] => xmlwriter
)
Кэширование результата для оптимизации
Пример php
function getCachedExtensions(): array {
    static $cache = null;
    if ($cache === null) {
        $cache = get_loaded_extensions();
    }
    return $cache;
}
// Многократный вызов без повторных запросов к внутренним структурам PHP
for ($i = 0; $i < 5; $i++) {
    $ext = getCachedExtensions();
}

PHP get_loaded_extensions function comments

En
Get loaded extensions Returns an array with the names of all modules compiled and loaded