PHP Startup: Unable to load dynamic library — что делать
В настройках PHP включён модуль, файла которого на сервере нет. PHP предупреждает об этом при запуске и работает дальше, но без модуля. Поставьте пакет модуля или уберите строку, которая его включает.
Содержание 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 0PHP 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.logPHP-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
Строку добавили вручную. Если модуль сайту нужен, поставьте его пакетом, а строку закомментируйте: пакет включит модуль сам.
- Поставьте пакет модуля:
sudo apt install php8.3-zip. Вместо zip подставьте имя модуля из сообщения, пакеты — в таблице ниже. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. Если модуль не нужен, пропустите этот шаг. - Откройте php.ini:
sudo nano /etc/php/8.3/fpm/php.ini. Для командыphpв окне SSH — файл/etc/php/8.3/cli/php.ini. - Нажмите Ctrl+W, введите
extension=zipи нажмите Enter — курсор встанет на строку с этой настройкой. Поставьте в начале строки точку с запятой:;extension=zip. - Сохраните файл: Ctrl+O, Enter, затем Ctrl+X.
- Перезапустите 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, которая включает чужой файл, закомментируйте.
Какой пакет ставить
| Модуль в сообщении | Пакет |
|---|---|
zip | php8.3-zip |
curl | php8.3-curl |
mbstring | php8.3-mbstring |
gd | php8.3-gd |
intl | php8.3-intl |
mysqli, pdo_mysql | php8.3-mysql |
pgsql, pdo_pgsql | php8.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 | найдите её в списке |
Источники
- Исходный код PHP 8.3.6: dl.c — текст Unable to load dynamic library: имя модуля и пути, по которым PHP его искал.
- Исходный код PHP 8.3.6: zend_API.c — текст Module "…" is already loaded.
- Исходный код PHP 8.3.6: main.c — приставки PHP Startup и PHP Request Startup, тексты Failed opening и Failed opening required; при фатальной ошибке и выключенном display_errors PHP отвечает кодом 500.
- Пакет php8.3-zip в Ubuntu 24.04 — модуль zip для PHP 8.3; так же называются php8.3-curl, php8.3-mbstring, php8.3-gd и другие.
Сверено 14 октября 2026 года.
Что почитать дальше
- Как установить PHP на UbuntuPHP-FPM, модули и php.ini.
- Ошибки PHPразборы ошибок PHP по тексту сообщения.
- Call to undefined functionкакой модуль нужен для функции.