概要
Debian GNU/Linux 9.12 (stretch) のホストで、php 5とapache 2の組み合わせでWordPressを動かしていたのだが、WordPress 5.4.1にはサイトのヘルスチェックを行う機能が追加されており、このヘルスチェックが「php 5は古すぎる」と警告を出してくる。
ごもっともなので、phpを7.xにアップデートする。
ついでにOS/ディストリビューションもDebian GNU/Linux 10.4 (buster)にアップデートする。
ポイント
そこそこ以前から運用してきたWordPressサイトの場合、charsetがlatin1に設定されたままのMySQLデータベーステーブルにutf8文字列が無理やり格納されているため、これを素直にアップデートしていくと、データベースの内容、つまりWordPressのコンテンツが無残に文字化けしてしまう。これを回避する必要がある。
データベースをダンプする
mysqldump -u root --default-character-set=latin1 データベース名 -h localhost -p > dumpdata
WordPressで用いているデータベース名は、Debian GNU/Linuxの場合、/etc/wordpress/config-WordPressホスト名.php
を見ればわかる。WordPressで用いているデータベースへの接続ユーザ名とパスワードもここを見ればわかる。
ただ、そのユーザ名義でmysqldumpしようとしても、データベース全体をロックできないと拒まれるので、-u root
を付けてスーパーユーザ名義で実行している。あるいはapacheをいったん止めてからmysqldumpすればいいだろう。
mysqldumpする際--default-character-set=latin1
をつけるのがポイント。charset=latin1なテーブルに(無神経に)utf8文字列が格納されてしまっている場合、それらを文字化けさせず、素直に、(ある意味無神経に)ダンプするには、こうする。ここで下手にutf8を指定してしまうと、歪んでいる現状を下手に正そうとする処理の結果、ダンプ結果が却って(人間にとっては)文字化けしてしまう。ダンプ結果をlv -Ou8 dumpdata
などして確認すると、utf8文字列がそのまま無事ダンプされていることがわかるだろう。
データベースのダンプをutf8にする
ファイルに含まれる文字列自体はすでにutf8なので、あとはtableのcharset指定などをutf8にしてやればよい。
いちおう念のためgrep latin1 dumpdata | lv
などして、文字列「latin1」の出現状況を確認のうえ、
sed 's/latin1/utf8/g' dumpdata > dumpdata.utf8
で置換してやればよい。
ブログ文中などコンテンツ自体にもlatin1
という文字列が含まれる場合は、よきに取り計らってください。
ここではutf8mb4
を指定しないほうがよい。ブログポスト本文(wp_posts)などは正常に見えたりするものの、例えばサードパーティーのthemeなど周辺に誤動作・文字化けが発生したりする。
Debian GNU/Linux 10.4にupgradeする
vi /etc/apt/sources.list (stretchをbusterに置換)
apt update
apt dist-upgrade
ついでに
apt autoremove
deborphan | xargs dpkg -P
などして不要なパッケージを掃除しておくのもよいだろう。
phpを7にする
php5系のパッケージをphp7.3系にアップグレードする。
ついでに、phpを稼働させるフレームワークもphp-fpmにした。mpm_worker + php-fpm にするを参考にさせていただいた。
dpkg -P libapache2-mod-php5 php5-cli php5-common php5-curl php5-gd php5-json php5-mysql php5-readline
apt install libapache2-mod-php7.3 php7.3-cli php7.3-common php7.3-curl php7.3-gd php7.3-json php7.3-mysql php7.3-readline
a2dismod mpm_prefork
apt install php-fpm
a2enmod proxy_fcgi setenvif
a2enconf php7.3-fpm
a2enmod mpm_worker
a2enmod php7.3
このあたり(このあたりに限らないが)your mileage may varies.
データベースを復旧する
この状態では、MySQLのlatin1テーブルに納められたutf8文字列が、php 5の時代は何も考えず無神経にutf8のまま扱われていたものが、きちんと? 文字化けするようになってしまっている。
なので、上の手順できちんとutf8にしておいたdumpdata.utf8を食べさせる。
mysql -u root データベース名 -h localhost -p < dumpdata.utf8
おしまい。