Я пытался заставить 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» (файл библиотеки был правильно установлен), и все заработало!