当ブログを動かしているさくらVPSサーバーのPHPをアップデートしてみました。
結構大変でした。
アップデートするワケ
- エックスサーバーで動かしているMD5の変換/逆変換のWordPressがだいぶ高速だったため。
- エックスサーバーのPHPはバージョン7
- PHPのバージョンが原因でWordPressが最新版に更新できなくなってたため。
- 5.5.19だった(^q^
PHP、Apache、MySQLがいずれも現行の最新版から乖離してしまってるので一つずつ見直していくことにしました。
今回はPHPだけアップデートを実施しました。
現状の把握
WordPressのアップデート画面に表示されてましたが、サーバーにSSH接続した状態でコマンドからも確認しました。
# yum list installed | grep php
19パッケージ見つかりました。
いずれもremiリポジトリを利用してインストールされていることがわかります。
remiリポジトリの最新化
リポジトリをrpmで再取得する前の状態をなんとなくキャプチャ。ホームディレクトリにバックアップしたりしました。
以下のコマンドでCentOS6用のremiリポジトリを再取得しました。
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
実行後はremi-php7~~の辺りが増えました。
PHP5.5をアンインストール
実際のところは後述するPHP7.3のインストールコマンドを先に行ったのですが依存関係が解決できなくインストールに失敗してしまいました。そのため既存のPHP5.5を削除するという流れになりました。
実行前にhttpdを停止しています。
# yum remove php*
PHP7.3をインストール
削除するパッケージのリストを元に以下のようなインストールコマンドを作成しました。
remiリポジトリは無効化されているので–enablerepoでインストールのときだけ有効化します。
# yum install --enablerepo=remi,remi-php73 php php-cli php-common php-devel php-mbstring php-mcrypt php-mysqlnd php-pdo php-pear php-pecl-jsonc php-pecl-jsonc-devel php-pecl-zip php-process php-xml
WordPressでは画像ファイルをアップロードする際のサムネイル生成に使用されています。
WordPressの動作確認中に気づいて別途インストールしました。
PHP5.5を削除した状態で依存関係が無事に解決できました。
インストール後、まずはphpコマンドでバージョンを確認。
意図したバージョンが表示されることを確認しました。
PHP7.3の設定
/etc以下に存在するphp.iniを編集します。
PHP5.5の頃の設定ファイルがphp.ini.rpmsaveという名前でバックアップされているので、diffで差分を取ってみました。単純にdiffコマンドで比較するとコメント行で大量に差分が出てよくわからなくなるので、何かないかと探してみたところまさにこれという情報を発見。
参考:2つの設定ファイルから空行やコメントを除いていい感じにdiffを表示するプチテクニック – モヒカンは正義
# diff <(grep -v '^;' /etc/php.ini | grep -v '^$') <(grep -v '^;' /etc/php.ini.rpmsave | grep -v '^$')
コマンドの意味あまりよくわかってません(^q^
結果を元にexpose_php、post_max_size、upload_max_filesize、date.timezoneの辺りをPHP5.5の頃のものに合わせて修正しました。
expose_phpがOnだとレスポンスヘッダーのX-Powerd-Byという項目でPHPのバージョンが表示されてしまいます。表示されてても特に問題はないですが、気になるのでいつもOffにしています。以下は変更前の状態でアクセスしたときの表示です。
動作確認する
PHPのアップデート後、停止していたhttpdを起動してブラウザでアクセスしたところ・・・
なんかでた(^q^
エラー調査
httpdのエラーログを確認し、以下のエラーが出てることを確認しました。
PHP Fatal error: Uncaught Error: Call to undefined function eregi()
エラーメッセージに表示されているstatpress-reloadedはアクセスの集計を行うWordPressプラグインです。
PHP7で廃止されたeregi関数の呼び出しが行われていることが原因でした。
参考:PHP: eregi – Manual
エラーメッセージの該当行です。他にもeregi関数を呼び出している箇所がいくつか見つかりました。
ドキュメントによるとpreg_match関数で代替可能ですが修正箇所が他にあった時のことを考えてプラグインを一時的に停止することにしました。
ただし、管理画面も一切がアクセス不可能な状態だったため、サーバーにwp-cliをインストールしてコマンドラインからプラグインを停止するという方法をとってみました。
wp-cliをインストール
# curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar # php wp-cli.phar --info # chmod +x wp-cli.phar # mv wp-cli.phar /usr/local/bin/wp
wp-cliのインストールは4行のコマンドだけでOKですがrootユーザーで実行したところ怒られてしまいました。rootで実行する際は–allow-rootをつける必要があるとのこと。
cdコマンドでWordPressのインストールディレクトリに移動した状態で以下のコマンドを実行しました。
# wp --allow-root plugin list # wp --allow-root plugin deactivate statpress-reloaded
アクティブなstatpress-reloadedプラグインがコマンドラインから無効化されていることが確認できました。
ブラウザで再度アクセスし「サイトに技術的な問題が発生しています。」という表示が消え、いつものトップ画面が表示されることを確認しました。
目的は達成したのでwp-cliはいったんアンインストールしました。
改めて動作確認
フロント側をざっと確認し問題ないことを確認。
その後、管理画面にログインしWordPress本体のアップデートを実施しました。以下のキャプチャはアップデート後の様子。
その他 – クラシックエディタを有効化する
WordPress5になって変わったこととしてエディタが以下のようなブロックエディタというものに変わっています。
フロント側との差異が減ったWYSIWYGエディタみたいな感じですが、慣れないのでClassic Editorというプラグインをインストールして元に戻しました。
上記のプラグインをインストールするだけでWordPress4の頃のエディタが使えるかと思います。
その他 – php-gdライブラリをインストール
画像をアップロードしたときにサムネイルが生成されていないことに気づいたので、以下のコマンドでphp-gdを追加しました。
# yum install --enablerepo=remi,remi-php73 php-gd
その他 – WordPress外のプログラムの確認
同一サーバー内に設置しているetc.imo-tikuwa.com配下のプログラムのうちPHPが使われているものをいくつか確認しました。
珍しい関数を使ったりしてるわけでもないので大丈夫でした。
その他 – アクセス集計プラグインの代替をインストール
statpress-reloadedは更新が停止してしまっていたのでNewStatPressという互換性のあるプラグインをインストールしました。
インストール後に確認したところアクセス数などが引き継がれていました。
反省点
アップデート前のPageSpeedInsightsのスコアを取り損ねました。。
体感的には少し早くなったような気がしないでもない?( ・`ー・´三 ・`ー・´)