LoginSignup
2
1

More than 3 years have passed since last update.

WordPressホストのphpを5から7にアップグレードする

Posted at

概要

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

おしまい。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1