PHP:无法加载动态库“mysqlnd”:仅在 CLI 中未定义符号

PHP: Unable to load dynamic library 'mysqlnd': undefinied symbol only in CLI

提问人:DarkLlama 提问时间:6/3/2023 更新时间:6/3/2023 访问量:208

问:

我无法让 mysql 相关函数在命令行中与 PHP 一起使用,在 apache Web 服务器上一切正常,甚至 PHPmyAdmin 也能完美运行。

操作系统:Debian 11

PHP版本:8.2

当我跑步时会发生什么php -v

PHP Warning:  PHP Startup: Unable to load dynamic library 'mysqlnd' (tried: /usr/lib/php/20220829/mysqlnd (/usr/lib/php/20220829/mysqlnd: cannot open shared object file: No such file or directory), 
/usr/lib/php/20220829/mysqlnd.so (/usr/lib/php/20220829/mysqlnd.so: undefined symbol: EVP_PKEY_CTX_new)) in Unknown on line 0

PHP Warning:  PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/lib/php/20220829/mysqli (/usr/lib/php/20220829/mysqli: cannot open shared object file: No such file or directory), 
/usr/lib/php/20220829/mysqli.so (/usr/lib/php/20220829/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/lib/php/20220829/pdo_mysql (/usr/lib/php/20220829/pdo_mysql: cannot open shared object file: No such file or directory), 
/usr/lib/php/20220829/pdo_mysql.so (/usr/lib/php/20220829/pdo_mysql.so: undefined symbol: mysqlnd_get_client_info)) in Unknown on line 0

我最初的问题是没有找到mysqli类,经过调查,我发现cli的php.ini不是/etc/php/8.2/cli/php.ini我一直在编辑,而是试图在/usr/local/lib/中加载一个不存在的php.ini。一旦我解决了这个问题,上述错误就开始出现。

在 apache 脚本中运行并显示它们都是相同版本的 PHP(具有相同版本的 Zend Engine),并从同一文件夹 (/usr/lib/php/20220829) 加载扩展phpinfo();php -i

我尝试完全卸载 PHP(最初是从源代码安装的)并重新安装它 - 同样的错误apt

也尝试过之前放入php.ini文件中,这没有区别,如果它们被注释掉也没有区别。extension=mysqlndextension=mysqli

PHP MySQLI

评论

0赞 Sergey92zp 6/3/2023
这里的秩序可能是问题。关于“如果它们被注释掉没有区别”,那么你可能做错了.ini 试试这个来找到正确的iniphp -i |grep php\.ini
0赞 Sammitch 6/3/2023
看起来您的系统可能设置了多个版本的 PHP,并且看起来您正在执行的任何 PHP 版本都在尝试加载为不同版本构建的扩展。撤消您对配置所做的更改,并参考您用于安装并行 PHP 版本的任何文档,了解如何为某些版本/安装安装扩展。
0赞 DarkLlama 6/3/2023
@Sergey92zp你是对的,我看错了。因此,注释掉扩展确实会有所作为。但目前的顺序是 mysqlnd > mysqli > pdo_mysql。
0赞 DarkLlama 6/3/2023
@Sammitch 我没有尝试安装并行 PHP 版本,并且通过 Apache 的“phpinfo()”和通过 CLI 的“php -v”都输出我运行的是 PHP 的 v8.2.6
1赞 Sergey92zp 6/3/2023
第一个错误看起来像SSL依赖,尝试apt-get install php8.2-openSSL

答:

0赞 DarkLlama 6/3/2023 #1

感谢@Sergey92zp为我指明了正确的方向。

通过 CLI 执行 PHP 时,OpenSSL 未加载。我无法通过 apt 安装。但是我能够按源代码编译“OpenSSL.so”扩展名。之后,需要先在php.ini启用它。所以扩展顺序是:openssl > mysqlnd > mysqli > pdo_mysqlphp8.2-OpenSSL