Get loaded extensions: примеры (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
...
)<?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')) { /* ... */ }Выводит обширную информацию о конфигурации PHP, включая все расширения. get_loaded_extensions даёт только массив имён, что удобно для программной обработки.
Возвращает массив имён функций, предоставляемых указанным расширением. Полезно в связке с get_loaded_extensions для глубокого анализа.
$json_funcs = get_extension_funcs('json'); // ['json_encode', ...]Аналоги в других языках программирования
В Python нет прямой аналогии, но информацию о модулях можно получить через sys.modules или pkgutil.
import sys
print(list(sys.modules.keys())[:5])['sys', 'builtins', '_frozen_importlib', ...]
В Node.js загруженные модули находятся в объекте require.cache.
console.log(Object.keys(require.cache));['/path/to/module.js', ...]
Для просмотра загруженных плагинов/расширений используется SQL-запрос.
SHOW PLUGINS;+----------------+----------+-------------------+ | Name | Status | Library | +----------------+----------+-------------------+
Основное отличие PHP-функции — она возвращает данные в виде массива, готового для использования в коде, а не для визуального вывода.
Типичные ошибки и особенности
Передача параметров других типов может привести к неожиданному поведению из-за неявного приведения типов в PHP.
// Неявное приведение строки к bool
$result = get_loaded_extensions('true'); // Строка 'true' преобразуется в true
print_r($result); // Вернёт 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 - корректен из-за неявного приведенияРасширенные примеры применения
Сценарий для анализа различий в окружениях.
$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 "Все необходимые расширения загружены.";
}$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 )
...
)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>";
}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 необходимо для обработки изображений.";
}$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
)function getCachedExtensions(): array {
static $cache = null;
if ($cache === null) {
$cache = get_loaded_extensions();
}
return $cache;
}
// Многократный вызов без повторных запросов к внутренним структурам PHP
for ($i = 0; $i < 5; $i++) {
$ext = getCachedExtensions();
}