Ошибки

PHP Startup: Unable to load dynamic library — что делать

В настройках PHP включён модуль, файла которого на сервере нет. PHP предупреждает об этом при запуске и работает дальше, но без модуля. Поставьте пакет модуля или уберите строку, которая его включает.

≈ 7 мин чтения
Содержание 12

Как выглядит ошибка

PHP Warning:  PHP Startup: Unable to load dynamic library 'zip' (tried: /usr/lib/php/20230831/zip (/usr/lib/php/20230831/zip: cannot open shared object file: No such file or directory), /usr/lib/php/20230831/zip.so (/usr/lib/php/20230831/zip.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
  • PHP Startup: — ошибка случилась при запуске PHP, ещё до открытия страниц сайта.
  • 'zip' — имя модуля из строки extension=zip в настройках PHP.
  • tried: — PHP искал файл модуля по двум путям: с именем как есть и с .so на конце. Папка /usr/lib/php/20230831 — место модулей PHP 8.3.
  • cannot open shared object file: No such file or directory — файла нет ни по одному пути: пакет модуля не установлен.
  • in Unknown on line 0 — номер строки PHP не сообщает. Как найти строку — ниже.

Сообщение видно в окне SSH при любой команде php, например php -v. PHP-FPM, который работает для сайта, пишет его в свой журнал при перезапуске — в строке со словами PHP message::

sudo tail -n 30 /var/log/php8.3-fpm.log

PHP-FPM при этом запускается, сайт открывается, но модуля нет. Функции из него дают ошибку Call to undefined function, классы — Class not found.

Как в Ubuntu включаются модули

В файлах php.ini из Ubuntu строки extension закомментированы — перед ними стоит точка с запятой, например ;extension=zip. Модули включаются по-другому: у каждого модуля есть файл в папке /etc/php/8.3/mods-available/, а в папке conf.d лежит ссылка на него. Папок conf.d две: /etc/php/8.3/fpm/conf.d/ — для сайта, /etc/php/8.3/cli/conf.d/ — для команды php в окне SSH.

Пакет модуля сам кладёт файл и ссылки. Поэтому модуль ставят пакетом, а не правкой php.ini: строка extension=zip без пакета и даёт эту ошибку. Команды — для PHP 8.3 из Ubuntu 24.04. В Ubuntu 26.04 стоит PHP 8.5: в путях и командах вместо 8.3 пишите 8.5. Какая версия у вас, покажет ls /etc/php/.

Найдите строку, которая включает модуль

Команды вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.

grep -n '^extension' /etc/php/8.3/fpm/php.ini /etc/php/8.3/fpm/conf.d/*.ini

Команда покажет все строки extension без точки с запятой в настройках PHP для сайта. Каждая строка ответа — файл, номер строки и сама строка, например /etc/php/8.3/fpm/conf.d/10-mysqlnd.ini:3:extension=mysqlnd.so. Найдите строку с именем модуля из сообщения. Для команды php в окне SSH проверьте её настройки:

grep -n '^extension' /etc/php/8.3/cli/php.ini /etc/php/8.3/cli/conf.d/*.ini

Строка нашлась в php.ini — смотрите следующий раздел. В файле из conf.d — раздел ниже.

Если строка в php.ini

Строку добавили вручную. Если модуль сайту нужен, поставьте его пакетом, а строку закомментируйте: пакет включит модуль сам.

  1. Поставьте пакет модуля: sudo apt install php8.3-zip. Вместо zip подставьте имя модуля из сообщения, пакеты — в таблице ниже. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. Если модуль не нужен, пропустите этот шаг.
  2. Откройте php.ini: sudo nano /etc/php/8.3/fpm/php.ini. Для команды php в окне SSH — файл /etc/php/8.3/cli/php.ini.
  3. Нажмите Ctrl+W, введите extension=zip и нажмите Enter — курсор встанет на строку с этой настройкой. Поставьте в начале строки точку с запятой: ;extension=zip.
  4. Сохраните файл: Ctrl+O, Enter, затем Ctrl+X.
  5. Перезапустите PHP-FPM: sudo systemctl restart php8.3-fpm. Если команда ничего не ответила, PHP перезапущен.

Если строка в файле из conf.d

Ссылка на модуль есть, а файла модуля нет. Поставьте пакет модуля:

sudo apt install php8.3-zip

Если модуль сайту не нужен, выключите его:

sudo phpdismod zip

Без уточнений phpdismod убирает ссылки на модуль для всех версий PHP на сервере — и для сайта, и для команды php. Включить модуль обратно — sudo phpenmod zip. После любой из команд перезапустите PHP-FPM: sudo systemctl restart php8.3-fpm.

Module "…" is already loaded

PHP Warning:  Module "mysqli" is already loaded in Unknown on line 0

Модуль включён дважды: Ubuntu уже включает его файлом из conf.d, а в php.ini добавлена ещё строка extension=mysqli. Модуль работает, но предупреждение будет при каждом запуске PHP. Найдите строку в php.ini командой выше, поставьте в её начале точку с запятой и перезапустите PHP-FPM.

Если модуль собран для другой версии PHP

Если вместо cannot open shared object file в сообщении есть слова Unable to initialize module и Module compiled with module API=, файл модуля есть, но он от другой версии PHP. Поставьте модуль пакетом с номером своей версии, например php8.3-zip, а строку extension, которая включает чужой файл, закомментируйте.

Какой пакет ставить

Модуль в сообщенииПакет
zipphp8.3-zip
curlphp8.3-curl
mbstringphp8.3-mbstring
gdphp8.3-gd
intlphp8.3-intl
mysqli, pdo_mysqlphp8.3-mysql
pgsql, pdo_pgsqlphp8.3-pgsql

Проверьте результат

  • php -v — в ответе нет строк PHP Warning, первая строка начинается с PHP 8.3.
  • php -m выведет список модулей PHP — нужный должен быть в нём.
  • Для сайта: перезапустите PHP-FPM и посмотрите журнал командой sudo tail -n 30 /var/log/php8.3-fpm.log — новых строк с Unable to load dynamic library нет.

Ошибки рядом

Что видитеЧто делать
Call to undefined functionпоставьте модуль с этой функцией
Call to undefined function mysqli_connect()поставьте модуль MySQL
Class "…" not foundнет класса: Composer или модуль
Composer пишет, что не хватает модуля PHPкакой пакет поставить
другая ошибка PHPнайдите её в списке

Источники

Сверено 14 октября 2026 года.

Что почитать дальше