Вопрос или проблема
Я получаю ошибку “Call to undefined function mysqli_connect()”, когда пытаюсь подключиться к базе данных из интерфейса командной строки (CLI), но тот же скрипт работает нормально в вебе.
Как я могу подключиться к базе данных из PHP CLI?
Спасибо!!!
.
Ответ или решение
Ошибка "Call to undefined function mysqli_connect()" в PHP CLI является частой проблемой, с которой сталкиваются разработчики, пытаясь выполнить скрипт из командной строки, в то время как тот же код прекрасно работает через веб-сервер. Давайте подробно разберем возможные причины этого явления и способы его устранения.
Теория
Проблема заключается в различиях между средами CLI и веб-сервера. Каждая из них может использовать разные конфигурационные файлы php.ini
. Веб-сервер (например, Apache или Nginx) читает свою версию конфигурационного файла, который может быть настроен так, чтобы использовать расширение mysqli
. В то время как CLI может использовать другой файл, в котором это расширение не загружено.
Другой ключевой момент — это пути установки PHP и предлагаемых расширений. Вполне возможно, что PHP CLI использует другую версию PHP, на которой mysqli
не установлен или не активирован.
Пример
Рассмотрим следующую ситуацию. Вы пишете PHP-скрипт, который успешно выполняется через веб-браузер, но при попытке запуска его через CLI вы получаете ошибку:
php myscript.php
И в ответ видите:
PHP Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /path/to/myscript.php:3
В то время как все работает корректно из браузера. Это означает, что расширение mysqli
не загружается в CLI-среде.
Применение
Проверьте конфигурационный файл php.ini
-
Найдите активный
php.ini
в CLI: Используйте следующую команду, чтобы увидеть, какой конфигурационный файл загружается для CLI:php -i | grep "Loaded Configuration File"
-
Сравните с
php.ini
веб-сервера: Убедитесь, что файл, загружаемый веб-сервером, и файл CLI используют одинаковые настройки. Вы можете проверить файл для веб-сервера, создав PHP-скрипт сphpinfo()
и открыв его через браузер. Сравните загруженные модули. -
Активируйте расширение
mysqli
в CLI: Откройте CLI-конфигурационный файлphp.ini
и проверьте наличие строки:extension=mysqli.so
Если этой строки нет, добавьте её. Если она закомментирована (например,
;extension=mysqli.so
), раскомментируйте её.
Убедитесь в одинаковой установке PHP
-
Проверка версии PHP: Убедитесь, что веб-сервер и CLI используют одну и ту же версию PHP:
php -v
Это поможет удостовериться, что конфигурации и расширения совместимы.
-
Совпадение путей: Проверьте, что путь к PHP одинаков как в CLI, так и на веб-сервере. Используйте команду
which php
для CLI иphpinfo()
для проверки через веб-сервер.
Проверка доступности расширения
-
Убедитесь, что файл
mysqli.so
действительно существует в директории расширений. Путь к этой директории обычно задается директивойextension_dir
вphp.ini
. -
Проверьте права доступа к файлам, чтобы убедиться, что PHP CLI имеет правильные разрешения для чтения файлов расширений.
Устранение зависимости
Если вы работаете в окружении, где у вас нет доступа к изменению конфигураций на сервере, возможно, вам стоит использовать альтернативные методы подключения к базе данных, такие как PDO. Это универсальное решение, которое также позволяет избежать подобных проблем:
$pdo = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
Заключение
Ошибка "Call to undefined function mysqli_connect()" в PHP CLI часто связана с неправильной конфигурацией php.ini
для CLI и веб-сервера. Убедитесь, что расширение mysqli
загружается в обеих средах. Проблема также может возникнуть из-за использования разных версий PHP или конфигурационных путей.Пройдите по всем приведенным выше шагам, чтобы диагностировать и устранить проблему, и ваши скрипты будут работать как из браузера, так и из командной строки без ошибок.