「PHP Warning: PHP Startup: Unable to load dynamic library ‘mysqli’」と警告が出たときの解決法

PHPのバージョンを7系から8系に引き上げてphpのバージョンを確認したら、こんなWarningが出るようになりました。

[dacelo@space ~]$ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/lib64/php/modules/mysqli (/usr/lib64/php/modules/mysqli: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mysqli.so (/usr/lib64/php/modules/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0
PHP 8.1.0RC4 (cli) (built: Oct 12 2021 23:53:13) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.0RC4, Copyright (c) Zend Technologies
with Zend OPcache v8.1.0RC4, Copyright (c), by Zend Technologies

さてどういうことでしょうか。確認のため、このPATHを見に行ってみると、

[dacelo@space ~]$ ll /usr/lib64/php/modules/mysqli.so
-rwxr-xr-x 1 root root 163456 10月 13 14:42 /usr/lib64/php/modules/mysqli.so

ちゃんとモジュールのファイルは存在しています。拡張子がないから?いやいや、このモジュールの読込の場合は、.so拡張子は省略可能なので、それもなさそう。
これが書いてある記述を確認しに行くと…

広告

[dacelo@space ~]$ view /etc/php.ini
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename
;
; For example:
;
extension=mysqli
;
; When the extension library to load is not located in the default extension
; directory, You may specify an absolute path to the library file:
;
;   extension=/path/to/extension/mysqli.so
;

「デフォルト位置にない場合は、フルパスで記述せよ」と書いてありますので、一応その通りに

extension=/usr/lib64/php/modules/mysqli.so

の記述に差し替えてみましたが、余計に変なエラーになりました。

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

ここでググってみると、「エラーが出るので『extension=mysqli』の行頭に;を付けてコメントアウトしたら出なくなりました!解決!」とか書いているブログがコロコロと出てくるんですが、いやそりゃ読み込みをやめたらエラーもでなくなるけど、そしたらmysqlのモジュール使えなくなってるだろが、と思いもう少し考えてみました。

そういえばphpのモジュールは、まとめて放り込んである場所があります。

[dacelo@space ~]$ ll /etc/php.d/
合計 116
-rw-r–r– 1 root root 5808 10月 13 14:36 10-opcache.ini
-rw-r–r– 1 root root 44 10月 13 14:42 20-bz2.ini
-rw-r–r– 1 root root 54 10月 13 14:42 20-calendar.ini
-rw-r–r– 1 root root 48 10月 13 14:42 20-ctype.ini
-rw-r–r– 1 root root 46 10月 13 14:42 20-curl.ini
-rw-r–r– 1 root root 44 10月 13 14:42 20-dom.ini
-rw-r–r– 1 root root 46 10月 13 14:42 20-exif.ini
-rw-r–r– 1 root root 54 10月 13 14:42 20-fileinfo.ini
-rw-r–r– 1 root root 44 10月 13 14:42 20-ftp.ini
-rw-r–r– 1 root root 52 10月 13 14:42 20-gettext.ini
-rw-r–r– 1 root root 48 10月 13 14:42 20-iconv.ini
-rw-r–r– 1 root root 54 10月 13 14:42 20-mbstring.ini
-rw-r–r– 1 root root 52 10月 13 14:42 20-mysqlnd.ini
-rw-r–r– 1 root root 44 10月 13 14:42 20-pdo.ini
-rw-r–r– 1 root root 46 10月 13 14:42 20-phar.ini
-rw-r–r– 1 root root 56 10月 13 14:42 20-simplexml.ini
-rw-r–r– 1 root root 52 10月 13 14:42 20-sockets.ini
-rw-r–r– 1 root root 50 10月 13 14:42 20-sodium.ini
-rw-r–r– 1 root root 52 10月 13 14:42 20-sqlite3.ini
-rw-r–r– 1 root root 56 10月 13 14:42 20-tokenizer.ini
-rw-r–r– 1 root root 44 10月 13 14:42 20-xml.ini
-rw-r–r– 1 root root 56 10月 13 14:42 20-xmlwriter.ini
-rw-r–r– 1 root root 44 10月 13 14:42 20-xsl.ini
-rw-r–r– 1 root root 50 10月 15 17:29 30-mysqli.ini
-rw-r–r– 1 root root 56 10月 13 14:42 30-pdo_mysql.ini
-rw-r–r– 1 root root 58 10月 13 14:42 30-pdo_sqlite.ini
-rw-r–r– 1 root root 56 10月 13 14:42 30-xmlreader.ini
-rw-r–r– 1 root root 645 10月 13 14:42 opcache-default.blacklist

お、ビンゴ。あるじゃないですかmysqli。この中を覗いてみると…

[dacelo@space ~]$ view /etc/php.d/30-mysqli.ini
; Enable mysqli extension module
extension=mysqli

なるほどそういうことね、ということで、/etc/php.ini の方のextensin=mysqliをコメントアウトしたら解決しました。(逆だとうまく行かなかった)

; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename
;
; For example:
;
;extension=mysqli
[dacelo@space ~]$ php -v
PHP 8.1.0RC4 (cli) (built: Oct 12 2021 23:53:13) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.0RC4, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.0RC4, Copyright (c), by Zend Technologies

これにて解決です。

About: dacelo


2 thoughts on “「PHP Warning: PHP Startup: Unable to load dynamic library ‘mysqli’」と警告が出たときの解決法”

Leave a Reply

Your email address will not be published. Required fields are marked *