При настройке Xdebug для PHP часто всплывает предупреждение:
PHP Warning: Failed loading Zend extension 'xdebug.so': cannot open shared object file: No such file or directory
Суть простая: PHP не находит модуль xdebug.so или не может его загрузить. Ниже пошаговый разбор типичных причин и способов починить загрузку расширения.
Почему PHP не грузит Xdebug
Чаще всего дело в одном из пунктов:
- Несовместимая версия Xdebug с вашей версией PHP.
- Неверный путь к
xdebug.soвphp.iniили conf.d. - Пакет Xdebug не установлен (или установлен не для той SAPI: CLI vs FPM/Apache).
- Несколько версий PHP в системе, а правка ушла не в тот ini-файл.
Шаг 1. Проверить, видит ли PHP модуль
Сначала убедитесь, что Xdebug вообще в списке модулей:
php -m | grep -i xdebug php -v
Если grep ничего не вывел, модуль не загружен. Имеет смысл сразу посмотреть, какой ini реально используется:
php --ini # для FPM отдельно, если отладка идёт через веб: php-fpm8.1 -i 2>/dev/null | head -n 5 # или phpinfo() в браузере
CLI и FPM/Apache часто читают разные ini. Правка только в cli/php.ini веб-серверу не поможет.
Шаг 2. Установить Xdebug
Через apt (Ubuntu/Debian)
Подставьте свою версию PHP вместо 8.1:
php -v sudo apt update sudo apt install php8.1-xdebug
Для 7.4, 8.2, 8.3 пакеты называются аналогично: php7.4-xdebug, php8.2-xdebug и т.д.
Через PECL
Когда в репозитории нет нужной сборки, ставят через PECL:
sudo apt install php-pear php8.1-dev sudo pecl install xdebug
После PECL в конце вывода обычно показывают путь к xdebug.so. Его и нужно прописать в ini (см. следующий шаг).
Шаг 3. Найти xdebug.so и прописать zend_extension
Если ошибка «No such file or directory» остаётся, путь в конфиге неверный. Найдите файл:
find /usr/lib/php/ -name 'xdebug.so' 2>/dev/null # иногда: find /usr/lib/ -name 'xdebug.so' 2>/dev/null
Пример найденного пути: /usr/lib/php/20210902/xdebug.so (каталог 20210902 зависит от ABI PHP).
Откройте ini для нужной SAPI. Для PHP 8.1 типичные пути:
sudo nano /etc/php/8.1/cli/php.ini sudo nano /etc/php/8.1/fpm/php.ini # или Apache: sudo nano /etc/php/8.1/apache2/php.ini # удобнее отдельный drop-in: # /etc/php/8.1/mods-available/xdebug.ini
Минимальная строка загрузки:
zend_extension=/usr/lib/php/20210902/xdebug.so
Если модуль лежит в стандартном extension_dir, иногда достаточно короткой формы (зависит от сборки):
zend_extension=xdebug
Перезапустите сервис, которым реально ходит приложение:
sudo systemctl restart php8.1-fpm # или sudo systemctl restart apache2 # nginx + php-fpm: достаточно рестарта fpm
Шаг 4. Проверить, что модуль реально загрузился
php --ini php -v php -m | grep -i xdebug
В php -v должна появиться строка вида:
with Xdebug v3.x.x, Copyright (c) 2002-2024, by Derick Rethans
Если в CLI всё ок, а в браузере нет, сравните вывод phpinfo() под веб-сервером: Loaded Configuration File и путь к zend_extension.
Шаг 5. Починка битых зависимостей
Если пакет поставился криво или после смены версии PHP остались «хвосты»:
sudo apt --fix-broken install sudo apt autoremove sudo apt clean
После смены major-версии PHP лучше переустановить phpX.Y-xdebug именно для новой X.Y, а не тащить старый .so.
Базовая настройка Xdebug 3 для локальной отладки
Для Xdebug 3 (порт по умолчанию 9003) типичный блок в conf.d / php.ini:
[xdebug] zend_extension=xdebug xdebug.mode=debug xdebug.start_with_request=yes xdebug.client_host=127.0.0.1 xdebug.client_port=9003 xdebug.log=/var/log/xdebug.log
Параметры xdebug.remote_enable / xdebug.remote_autostart относятся к Xdebug 2. В третьей ветке их не используют: вместо них mode, start_with_request, client_host, client_port.
После правок снова рестарт FPM/Apache и проверка:
sudo systemctl restart php8.1-fpm php -m | grep -i xdebug
Краткий чеклист
- Версия PHP и пакет
phpX.Y-xdebugсовпадают. xdebug.soсуществует, путь вzend_extensionверный.- Правки внесены в ini той SAPI, которой пользуется приложение.
- Сервис перезапущен,
php -m/phpinfo()показывают xdebug. - Конфиг соответствует ветке Xdebug (2 vs 3).
Итог
Ошибка «Failed loading Zend extension ‘xdebug.so’» почти всегда сводится к отсутствующему пакету, чужому пути к .so или правке не того php.ini. Проверьте установку, найдите реальный файл модуля, пропишите zend_extension и перезапустите нужный PHP-сервис. После этого IDE сможет ловить брейкпоинты, а предупреждение в логах пропадёт.


