Назад | Перейти на главную страницу

PHP «mysqli.so: undefined symbol: mysqlnd_connect in Unknown в строке 0»

Я пытался заставить PHP CLI (7.0.7 на Ubuntu) работать вместе с mysqli, но безуспешно. При запуске я получаю то же сообщение об ошибке:

mysqli.so: undefined symbol: mysqlnd_connect in Unknown on line 0

Это часть вывода php -i (ясно показывающая, что оба были загружены):

mysqli

MysqlI Support => enabled
Client API library version => mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $
Active Persistent Links => 0
Inactive Persistent Links => 0
Active Links => 0

Directive => Local Value => Master Value
mysqli.allow_local_infile => On => On
mysqli.allow_persistent => On => On
mysqli.default_host => no value => no value
mysqli.default_port => 3306 => 3306
mysqli.default_pw => no value => no value
mysqli.default_socket => no value => no value
mysqli.default_user => no value => no value
mysqli.max_links => Unlimited => Unlimited
mysqli.max_persistent => Unlimited => Unlimited
mysqli.reconnect => Off => Off
mysqli.rollback_on_cached_plink => Off => Off

mysqlnd

mysqlnd => enabled
Version => mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $
Compression => supported
core SSL => supported
extended SSL => supported
Command buffer size => 4096
Read buffer size => 32768
Read timeout => 31536000
Collecting statistics => Yes
Collecting memory statistics => No
Tracing => n/a
Loaded plugins => mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password
API Extensions => mysqli,pdo_mysql

PHP был установлен с использованием sudo apt install php7.0-cli.

Что случилось?

Когда вы загружаете mysqli после mysqlnd, это решает проблему. НО

если вы используете phpenmod для включения модулей, которые они включают, в алфавитном порядке. mysqli находится перед mysqlnd в порядке.

Я обошел это, переименовав символические ссылки с mysqli в zmysqli - грубо, но это сработало.

Я просматривал несколько установочных документов для php, и один сказал, что нужно включить extension = mysqli в php.ini (раскомментируйте его), но phpenmod был включен, и поэтому mysqli не должен быть в php.ini. Я закомментировал строку, и все загружено должным образом.

Причина в том, что вам нужно загрузить mysqlnd перед загрузкой расширения mysql / php-mysqli / mysqli / php-mysqli.

Перед загрузкой этих расширений проверьте php.ini, загружен ли php-mysqlnd. Иногда apache решает разделить все расширения в отдельные файлы .ini, вы должны убедиться, что файл mysqlnd загружен до расширения php-mysqli и друга, переименовав файл.

В моей ситуации (Debian 9) порядок был правильным: файл php-mysqlnd.ini находился вверху списка модулей. Чтобы изменить порядок модулей, просто измените конечный номер, чтобы у вас были ссылки «10-mysqlnd.ini» и «20-mysqli.ini», указывающие на их файлы .ini в доступных модах. Я заметил, что файл mysqlnd.ini был пуст, возможно, из-за неправильной установки. Я просто добавил контент вроде «extension = mysqlnd.so» (файл библиотеки был правильно установлен), и все заработало!