今日ローカルサーバーでphpMyAdminにアクセスしようとしたら、この表示。
おおーい、エラーかーい。あああやっぱり出たよ、OSアップデートの弊害が。mbstringがないとな。PHP関連では毎回苦労する。PHPのバージョンが上がるたびに、それに振り回されるのだ。PHPのバージョンていくつになったんだ?
$ php -v
PHP 7.2.24-0ubuntu0.18.04.6 (cli) (built: May 26 2020 13:09:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.24-0ubuntu0.18.04.6, Copyright (c) 1999-2018, by Zend Technologies
7.2か。7.2のmbstringが入ってないのか?
$ dpkg -l | grep mbstring
ii php-mbstring 1:7.2+60ubuntu1 all MBSTRING module for PHP [default]
rc php7.0-mbstring 7.0.33-0ubuntu0.16.04.15 amd64 MBSTRING module for PHP
ii php7.2-mbstring 7.2.24-0ubuntu0.18.04.6 amd64 MBSTRING module for PHP
入ってるじゃないか。なんでmissingなんだ。
なんか悪い予感がするが、ひょっとして、と思ってWebでphpinfo()を表示させてみた。
おおお!こっちは7.0だと。というか「PHP Version 7.0.33-0ubuntu0.16.04.15」て何?「16.04」てところがすげー気になるんだけど。
Apache用のPHPモジュールは別に7.2用のがあって、それを明示的に指定して入れないといけないのかな。
$ apt-cache search libapache2-mod-php7.2
libapache2-mod-php7.2 - server-side, HTML-embedded scripting language (Apache 2 module)
php7.2-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
あ、それらしきものが。
$ sudo apt-get install libapache2-mod-php7.2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
libapache2-mod-php7.2
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
1,350 kB のアーカイブを取得する必要があります。
この操作後に追加で 4,793 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libapache2-mod-php7.2 amd64 7.2.24-0ubuntu0.18.04.6 [1,350 kB]
1,350 kB を 1秒 で取得しました (2,042 kB/s)
以前に未選択のパッケージ libapache2-mod-php7.2 を選択しています。
(データベースを読み込んでいます ... 現在 159029 個のファイルとディレクトリがインストールされています。)
.../libapache2-mod-php7.2_7.2.24-0ubuntu0.18.04.6_amd64.deb を展開する準備をしています ...
libapache2-mod-php7.2 (7.2.24-0ubuntu0.18.04.6) を展開しています...
libapache2-mod-php7.2 (7.2.24-0ubuntu0.18.04.6) を設定しています ...
Creating config file /etc/php/7.2/apache2/php.ini with new version
php_invoke: Enabled module dom for apache2 sapi
php_invoke: Enabled module posix for apache2 sapi
php_invoke: Enabled module sysvsem for apache2 sapi
php_invoke: Enabled module sysvshm for apache2 sapi
php_invoke: Enabled module xml for apache2 sapi
php_invoke: Enabled module bz2 for apache2 sapi
php_invoke: Enabled module iconv for apache2 sapi
php_invoke: Enabled module tokenizer for apache2 sapi
php_invoke: Enabled module sockets for apache2 sapi
php_invoke: Enabled module xmlwriter for apache2 sapi
php_invoke: Enabled module json for apache2 sapi
php_invoke: Enabled module ctype for apache2 sapi
php_invoke: Enabled module pdo for apache2 sapi
php_invoke: Enabled module wddx for apache2 sapi
php_invoke: Enabled module xsl for apache2 sapi
php_invoke: Enabled module shmop for apache2 sapi
php_invoke: Enabled module ftp for apache2 sapi
php_invoke: Enabled module simplexml for apache2 sapi
php_invoke: Enabled module fileinfo for apache2 sapi
php_invoke: Enabled module opcache for apache2 sapi
php_invoke: Enabled module sysvmsg for apache2 sapi
php_invoke: Enabled module phar for apache2 sapi
php_invoke: Enabled module readline for apache2 sapi
php_invoke: Enabled module smbclient for apache2 sapi
php_invoke: Enabled module calendar for apache2 sapi
php_invoke: Enabled module exif for apache2 sapi
php_invoke: Enabled module gd for apache2 sapi
php_invoke: Enabled module xmlreader for apache2 sapi
php_invoke: Enabled module gettext for apache2 sapi
php_invoke: Enabled module mbstring for apache2 sapi
libapache2-mod-php7.2: Disabling old php7.0 in favor of using PHP 7.2
最後に「Disabling old php7.0 in favor of using PHP 7.2」と出たのでこれでいけるかと思いきや、それでもだめ。PHPinfoの内容は変わらずVer7.0のまま。Ver7.0用のmbstringはあるのか調べたら、
$ dpkg -l|grep php7.0|grep mbstring
rc php7.0-mbstring 7.0.33-0ubuntu0.16.04.15 amd64 MBSTRING module for PHP
rcだから、設定ファイルだけ残っているということか。7.0と7.2のモジュールを別々に持つことはできないの?それはちょっと無理か。ここに書いてる7.0.33-0ubuntu0.16.04.15というバージョンがやっぱり気になる。Apacheが7.2を使ってくれないとライブラリとの整合性が取れないよな。
論理的に考えよう。ApacheがどのPHPのモジュールを選択するかどこで定義されている?Apacheのコンフィギュレーションファイルだ。それはmods-availableにあるはずだ。どれどれ、
$ cd /etc/apache2/mods-available/
$ ls php*
php7.0.conf php7.0.load php7.2.conf php7.2.load
うむ、availableに7.0と7.2が混在している。おかしいな、さっき上で「libapache2-mod-php7.2: Disabling old php7.0 in favor of using PHP 7.2」と出たのに。まあいいや、7.0をDisableにしてみよう。
$ sudo a2dismod php7.0
Module php7.0 disabled.
To activate the new configuration, you need to run:
systemctl restart apache2
$ sudo service apache2 restart
これでどうだ。とりあえずPHPのバージョンは?
おお、無事ApacheでPHP7.2を使ってくれるようになった。これでいけるか?phpMyAdminを再度表示。
まだだめか・・・。いや、mbstring問題は解決したっぽい。「mysqli拡張がありません」とな。なんかモジュールがないのか?ちょっと調べてみる。
$ dpkg -l|grep php|grep mysql
ii php7.0-mysql 7.0.33-0ubuntu0.16.04.15 amd64 MySQL module for PHP
うむ、PHP用のMySQLモジュールは7.0用のしか入ってないっぽい。当然7.2用のもあるんだろうね。
$ apt-cache search php7.2-mysql
php7.2-mysql - MySQL module for PHP
あるっぽい。じゃあインストール。
$ sudo apt-get -y install php7.2-mysql
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
php7.2-mysql
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
117 kB のアーカイブを取得する必要があります。
この操作後に追加で 449 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 php7.2-mysql amd64 7.2.24-0ubuntu0.18.04.6 [117 kB]
117 kB を 1秒 で取得しました (230 kB/s)
以前に未選択のパッケージ php7.2-mysql を選択しています。
(データベースを読み込んでいます ... 現在 159046 個のファイルとディレクトリがインストールされています。)
.../php7.2-mysql_7.2.24-0ubuntu0.18.04.6_amd64.deb を展開する準備をしています ...
php7.2-mysql (7.2.24-0ubuntu0.18.04.6) を展開しています...
php7.2-mysql (7.2.24-0ubuntu0.18.04.6) を設定しています ...
Creating config file /etc/php/7.2/mods-available/mysqlnd.ini with new version
Creating config file /etc/php/7.2/mods-available/mysqli.ini with new version
Creating config file /etc/php/7.2/mods-available/pdo_mysql.ini with new version
libapache2-mod-php7.2 (7.2.24-0ubuntu0.18.04.6) のトリガを処理しています ...
インストール完了。これでどうだろうと試したが、まだだめ。「PHPの設定をチェックしてみてください」と書いてあるのでFAQを読んでみた。
To connect to a MySQL server, PHP needs a set of MySQL functions called “MySQL extension”. This extension may be part of the PHP distribution (compiled-in), otherwise it needs to be loaded dynamically. Its name is probably mysqli.so or php_mysqli.dll. phpMyAdmin tried to load the extension but failed. Usually, the problem is solved by installing a software package called “PHP-MySQL” or something similar.
There are currently two interfaces PHP provides as MySQL extensions – mysql and mysqli. The mysqli is tried first, because it’s the best one.
う~ん、MySQL接続用のモジュールがロードされてないか。定義ファイル自体はあるよな。
$ ls -l /etc/php/7.2/mods-available/mysql*
-rw-r--r-- 1 root root 71 5月 26 22:09 /etc/php/7.2/mods-available/mysqli.ini
-rw-r--r-- 1 root root 72 5月 26 22:09 /etc/php/7.2/mods-available/mysqlnd.ini
ふむ。mysqlndというのはなんだろう。まあいいや。
$ cat mysqli.ini
; configuration for php mysql module
; priority=20
extension=mysqli.so
mysqli.soというのはextensionとしてちゃんとある。これをどこかでロードするように定義してやるはずなんだろうが、どこかと言ってもphp.iniくらいしかないはずだが。php.iniを見ると、
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
; extension=modulename
;
; For example:
;
; extension=mysqli
と書いてあるので、そのとおりにしてみた。注意したのは、これは/etc/php/7.2/cli/php.ini ではなく、/etc/php/7.2/apache2/php.ini の方。
これをやってからApacheを再起動して、リトライ。
ようやくたどり着いたよ。毎回こんなことをしているな。
ログインしてテーブルの中身を表示させようとしたところ、
なんか真っ赤になってエラーになった。「サーバー上でいくつかのエラーが検出されました!このウインドウの下を見てください」と書いてあるが、phpMyAdminのコードでWarningが出ているのでこっちの知ったこっちゃない。「無視」というボタンを押したらちゃんと結果が表示されたから、もういいやこれで。