Ubuntu20.04编译PHP8.3后mysqli.so找不到问题求助
在Ubuntu 20.04服务器上从源码编译PHP8.3,编译安装步骤如下:
./configure --prefix=/home/ubuntu/php8.3 --enable-zts --with-mysqli --disable-fileinfo --with-openssl --with-zlib --with-curl --enable-pcntl --enable-mysqlnd make -j4 sudo make install
将php.ini-production复制到/home/ubuntu/php8.3/lib/php.ini,并在其中开启了extension=mysqli配置。但执行/home/ubuntu/php8.3/bin/php -v时出现如下警告:
PHP Warning: PHP Startup: Unable to load dynamic library 'mysqli' (tried: /home/ubuntu/php8.3/lib/php/extensions/no-debug-zts-20220830/mysqli (/home/ubuntu/php8.3/lib/php/extensions/no-debug-zts-20220830/mysqli: cannot open shared object file: No such file or directory), /home/ubuntu/php8.3/lib/php/extensions/no-debug-zts-20220830/mysqli.so (/home/ubuntu/php8.3/lib/php/extensions/no-debug-zts-20220830/mysqli.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
检查/home/ubuntu/php8.3/lib/php/extensions/no-debug-zts-20220830/目录,发现其中只有opcache.so文件。然而执行/home/ubuntu/php8.3/bin/php -m时,输出显示已加载mysqli模块:
[PHP Modules] Core ctype curl date dom filter hash iconv json libxml mysqli mysqlnd openssl pcntl pcre PDO pdo_sqlite Phar posix random Reflection session SimpleXML SPL sqlite3 standard tokenizer xml xmlreader xmlwriter zlib [Zend Modules]
请问mysqli.so文件在哪里?哪里操作出错了?
问题核心:你编译PHP时使用的
--with-mysqli参数默认将mysqli静态编译进了PHP主程序,不会生成独立的mysqli.so动态库文件。此时在php.ini中开启extension=mysqli属于多余操作,PHP启动时会尝试加载不存在的动态库,因此抛出警告。而php -m显示mysqli已加载,是因为它本身就内嵌在PHP程序里。验证方式:执行以下命令查看mysqli的加载模式:
/home/ubuntu/php8.3/bin/php -i | grep -A 5 "mysqli"
若输出包含Linked statically字样,即可确认mysqli为静态编译。
解决步骤:
- 编辑
/home/ubuntu/php8.3/lib/php.ini,找到extension=mysqli行,在行首添加;注释掉该配置。 - 保存文件后重新执行
/home/ubuntu/php8.3/bin/php -v,警告会消失。
- 编辑
额外说明:如果需要将mysqli编译为动态扩展,需在configure阶段使用
--with-mysqli=shared,mysqlnd参数,之后重新编译安装。但静态编译的mysqli功能完整,无需刻意切换为动态扩展。
内容的提问来源于stack exchange,提问作者Adriano

