Типы PHP-расширений
PHP-расширения расширяют возможности языка: добавляют поддержку баз данных, изображений, криптографии, сетевых протоколов. Существует два типа: встроенные (идут в комплекте с PHP) и PECL-расширения (устанавливаются отдельно через pecl или apt).
Просмотр установленных расширений
# Список всех загруженных расширений
php -m
# Проверить конкретное расширение
php -m | grep curl
# Подробная информация
php --ri gdУстановка расширений через apt
# Обновляем список пакетов
sudo apt update
# Устанавливаем расширения для PHP 8.2
sudo apt install php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml \
php8.2-zip php8.2-mysql php8.2-pgsql php8.2-redis \
php8.2-imagick php8.2-intl php8.2-bcmath php8.2-soap
# Перезапускаем PHP-FPM
sudo systemctl restart php8.2-fpmНеобходимые расширения для популярных CMS
| CMS / Фреймворк | Обязательные расширения |
|---|---|
| WordPress | curl, gd, mbstring, mysql, xml, zip, intl |
| Laravel | bcmath, ctype, curl, dom, fileinfo, json, mbstring, openssl, pdo, tokenizer, xml |
| Drupal | gd, pdo, xml, json, mbstring, dom, hash |
| Magento 2 | bcmath, curl, gd, intl, mbstring, pdo_mysql, soap, xsl, zip |
Установка PECL-расширений (Redis, Imagick)
# Redis через apt (рекомендуется)
sudo apt install php8.2-redis
# Imagick
sudo apt install php8.2-imagick
# Через PECL (если нет в apt)
sudo pecl install redis
echo "extension=redis.so" | sudo tee /etc/php/8.2/mods-available/redis.ini
sudo phpenmod redisУправление расширениями: phpenmod / phpdismod
# Включить расширение
sudo phpenmod -s fpm mbstring
# Отключить расширение
sudo phpdismod -s fpm xdebug
# Применить изменения
sudo systemctl reload php8.2-fpmsudo apt install php7.4-curl php8.1-curl php8.2-curl — каждое расширение устанавливается независимо для каждой версии PHP.Компиляция расширения из исходников
sudo apt install php8.2-dev
pecl download xdebug
tar xf xdebug-*.tgz && cd xdebug-*
phpize && ./configure --with-php-config=/usr/bin/php-config8.2
make && sudo make installТипичные ошибки без нужного расширения
Call to undefined function
PHP Fatal error: Uncaught Error: Call to undefined function curl_init() in /var/www/html/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php:1Значит расширение curl не установлено вовсе, либо установлено, но не включено для того SAPI, который реально обслуживает запрос. CLI и FPM у одной версии PHP используют отдельные каталоги conf.d, и список модулей у них может отличаться.
could not find driver (PDO)
PDOException: could not find driver in /var/www/html/app/Database.php:14Частая ошибка новичков: расширение pdo установлено, а конкретный драйвер — pdo_mysql или pdo_pgsql — нет. Это два разных пакета в apt.
Class "Imagick" not found
Fatal error: Uncaught Error: Class "Imagick" not found in /var/www/html/app/Thumbnail.php:9PECL-расширение установлено, но не активировано, либо активировано только для одного из SAPI.
Когда установки через apt недостаточно
- Расширение включено для CLI, но не для FPM (или наоборот) — управление модулями раздельное:
phpenmod -s fpm curlиphpenmod -s cli curl— разные команды. - После
apt install php8.2-imagickзабыли перезапустить FPM — модуль подгружается в память процесса только при его старте, простогоreloadNginx недостаточно. - Версия расширения из репозитория ondrej/php ещё не собрана под самую свежую версию PHP — тогда остаётся либо ждать обновления пакета, либо собирать из исходников.
- Сайт использует несколько версий PHP одновременно — расширение нужно ставить под каждую версию отдельно, apt не делает это автоматически.
Проверка результата
# Расширение видно интерпретатору вообще?
php -m | grep -i curl
# Явная проверка из кода — надёжнее grep
php -r "var_dump(extension_loaded('curl'));"
# То же самое, но для PHP-FPM: создайте info.php с phpinfo()
# и ищите секцию расширения в выводе браузера — список модулей
# CLI и FPM показывается там отдельно и может отличатьсяЕсли php -m показывает модуль, а код всё равно падает с «Call to undefined function» — почти наверняка вы проверяли CLI, а ошибка приходит из FPM (или наоборот).
Ещё один источник путаницы — расширения, собранные вручную из исходников: они кладутся не в /etc/php/8.2/mods-available/, а туда, куда указали при сборке, и phpenmod о них ничего не знает. Такие модули нужно подключать вручную директивой extension= в отдельном ini-файле и включать её в нужный конфиг SAPI руками, без автоматизации apt.
После обновления системы через apt upgrade модули, собранные из исходников, не обновляются вместе с пакетным PHP — при переходе на новую минорную версию их придётся пересобирать заново, иначе после перезапуска FPM появится ошибка о несовместимой версии API модуля.