開発環境のPHP7.4に8.0を+して切り替えながら使用する【2】

開発環境

さて、前回記事開発環境のPHP7.4に8.0を+して切り替えながら使用する【1】で予告した通り、ウェブサーバーがちゃんとPHP8.0を使ってくれるようになるまでのことをやります。

ウェブサーバーの確認

今回はApacheでやっていますので、ウェブのトップディレクトリ(デフォなら/var/www/html)の極力上層にphpinfoを見られるようにファイルを配置します。

$ sudo echo "<?php phpinfo(); ?>" > /var/www/html/info.php

で、/info.phpにアクセスしてみると、なななんと、「PHP Version 7.4.3」と!

PHP7.4のまま

変わってないじゃん。

あ、そうか、ということでApacheを再起動しても変わらず。

それもそのはず、利用中なのはモジュール版のPHP。

mod_php7

ほら、mod_php7 が読み込まれてる。

というわけで、読み込むモジュールを指定してる部分を見てみます。

とりあえず /etc/apache2に移動して、有効なモジュールの一覧にPHP8.0のものが入っていることを確認します。

$ cd /etc/apache2
$ ll mods-available | grep php
-rw-r--r-- 1 root root   855 Oct  7 00:47 php7.4.conf
-rw-r--r-- 1 root root   102 Oct  7 00:47 php7.4.load
-rw-r--r-- 1 root root   855 Mar  5 16:54 php8.0.conf
-rw-r--r-- 1 root root   101 Mar  5 16:54 php8.0.load

うん、ちゃんと入っていますね。

では、読み込まれているものをチェック。

$ ll mods-enabled | grep php
lrwxrwxrwx 1 root root   29 Mar 19 13:41 php7.4.conf -> ../mods-available/php7.4.conf
lrwxrwxrwx 1 root root   29 Mar 19 13:41 php7.4.load -> ../mods-available/php7.4.load

まあ分かりきっていたことではありますが、PHP7.4のモジュールが読み込まれているということですね。

では、シンボリックリンクを張り直しましょう。

ここで!

シンボリックを張ったり削除したり、とやってたんですが、どうやら便利なコマンドがあるようです。

Apache/a2enmodとa2dismodコマンドの動作について

これでmods-availableとmods-enablesのやりとりをやってくれるそうです!

# php7.4を外す
$ sudo a2dismod php7.4
Module php7.4 disabled.
To activate the new configuration, you need to run:
  systemctl restart apache2

# php8.0を読み込む
$ sudo a2enmod php8.0
Considering dependency mpm_prefork for php8.0:
Considering conflict mpm_event for mpm_prefork:
Considering conflict mpm_worker for mpm_prefork:
Module mpm_prefork already enabled
Considering conflict php5 for php8.0:
Enabling module php8.0.
To activate the new configuration, you need to run:
  systemctl restart apache2

# 確認
ll | grep php
lrwxrwxrwx 1 root root   29 Mar 19 14:49 php8.0.conf -> ../mods-available/php8.0.conf
lrwxrwxrwx 1 root root   29 Mar 19 14:49 php8.0.load -> ../mods-available/php8.0.load

# Apacheの再起動
$ sudo systemctl restart apache2

a2enmodコマンドでは依存関係も自動的にゴニョゴニョやってくれるようですので、手作業でシンボリックリンクを張ったり外したりするのとは根本的に違うような気がします。

さて、これでもう一度 info.phpにアクセスしてみます。

すると、無事に8.0.3にアップグレードされていることが確認できました!!

PHP80

とりあえずめでたし!

ワードプレス管理画面でエラーが!!

三項演算子でFatal Error

ここで、いったんワードプレスの管理画面を更新したところ、白画面にFatal Errorの表示。

Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported.
Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in 
/var/www/html/xxxxxxxx/wp/wp-content/themes/luxeritas/inc/custom-css.php on line 898

要は、三項演算子の括弧無しでのネストがPHP7.4では非推奨になっていたが、PHP8.0ではFetalErrorになるようになった、ということらしいです。

参考【PHP8.0】PHPの三項演算子が他言語の実装に一歩近付く

対象ファイルはLuxeritasの親テーマだったので手を入れたくなかったのですが、

# 898行目
$head_padding = isset( $head_padding ) ? $head_padding : isset( $luxe['head_band_height'] ) ? $luxe['head_band_height'] : 0;

とりあえず、応急処置としてこのファイルに直接手を入れます

$head_padding = ( isset( $head_padding ) ? $head_padding : isset( $luxe['head_band_height'] ) ) ? $luxe['head_band_height'] : 0;

最初に出てくる三項演算子の部分をカッコで括ります。

そうしたところ、エラーは消えて管理画面が表示されました!

【謎】いくつかのDeprecate が表示されるが、いつの間にか消えて無くなる

エラーが消えて管理画面が表示されたのはいいのですが、5つぐらい、deprecateを知らせるnoticeが出てました。

Deprecated: Required parameter $pages follows optional parameter $rel in /var/www/html/xxxxxxx/wp/wp-content/themes/luxeritas/inc/wpfunc.php on line 324

Deprecated: Required parameter $value follows optional parameter $key in /var/www/html/xxxxxxx/wp/wp-content/themes/luxeritas/inc/thk-mod-class.php on line 40

Deprecated: Required parameter $value follows optional parameter $key in /var/www/html/xxxxxxx/wp/wp-content/themes/luxeritas/inc/thk-mod-class.php on line 99

Deprecated: Required parameter $value follows optional parameter $key in /var/www/html/xxxxxxx/wp/wp-content/themes/luxeritas/inc/thk-mod-class.php on line 137

それが、なんだかんだしてるうちにいつの間にか表示が消えちゃってました。

ちなみにwp-config.phpのデバッグモードは

define('WP_DEBUG', true);

ちゃんとtrueにしてます。

謎です。

【謎2】先ほどのFatal Errorも消えて無くなる

で、ですね。

ブログのために現象を再現しようと思ってですね、上で直接修正した luxeritas/inc/custom-css.php を元に戻そう(どちらにしろ子テーマで解決しなきゃいけないので)と、先ほど加えたカッコを削除してセーブ。

そして管理画面をリロードしたところ・・・

普通に画面表示されてるんですけど。Fatal ErrorどころかNoticeも何も出てない。

なので、再度の修正はせずに放置。

謎です。

サイトヘルスをチェック、推奨モジュールを追加

で、サイトヘルスをチェックしたところ、二つほど推奨モジュールのインストールを促されたので入れておきます。

※ WPのバージョンが5.7.0だとhttps関連のエラーが出ますが、これはPHP8とは無関係です。
参考:[ワードプレス]バージョン5.7で「サイトのHTTPS接続に問題があります」正解は放置??

  • 警告 オプションのモジュール imagick がインストールされていないか、無効化されています。

  • 警告 オプションのモジュール zip がインストールされていないか、無効化されています。

# とりあえずパッケージをチェック
$ sudo apt list| grep -e php8.0 -e zip -e imagick
# たくさん出てきすぎるので該当するものだけ
php8.0-zip/focal 8.0.3-1+ubuntu20.04.1+deb.sury.org+1 amd64
php8.0-imagick/focal 3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1 amd64

# 上記二つをインストール
$ sudo apt -y install php8.0-zip php8.0-imagick
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libzip4 php-imagick
The following NEW packages will be installed:
  libzip4 php8.0-imagick php8.0-zip
The following packages will be upgraded:
  php-imagick
1 upgraded, 3 newly installed, 0 to remove and 73 not upgraded.
Need to get 195 kB of archives.
After this operation, 288 kB of additional disk space will be used.
Get:1 http://ppa.launchpad.net/ondrej/php/ubuntu focal/main amd64 php-imagick amd64 3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1 [12.3 kB]
Get:2 http://ppa.launchpad.net/ondrej/php/ubuntu focal/main amd64 php8.0-imagick amd64 3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1 [103 kB]
Get:3 http://ppa.launchpad.net/ondrej/php/ubuntu focal/main amd64 libzip4 amd64 1.7.3-1+ubuntu20.04.1+deb.sury.org+2 [55.1 kB]                                                                             
Get:4 http://ppa.launchpad.net/ondrej/php/ubuntu focal/main amd64 php8.0-zip amd64 8.0.3-1+ubuntu20.04.1+deb.sury.org+1 [23.9 kB]                                                                          
Fetched 195 kB in 15s (13.0 kB/s)                                                                                                                                                                          
(Reading database ... 114305 files and directories currently installed.)
Preparing to unpack .../php-imagick_3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1_amd64.deb ...
Unpacking php-imagick (3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1) over (3.4.4-4) ...
Selecting previously unselected package php8.0-imagick.
Preparing to unpack .../php8.0-imagick_3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1_amd64.deb ...
Unpacking php8.0-imagick (3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1) ...
Selecting previously unselected package libzip4:amd64.
Preparing to unpack .../libzip4_1.7.3-1+ubuntu20.04.1+deb.sury.org+2_amd64.deb ...
Unpacking libzip4:amd64 (1.7.3-1+ubuntu20.04.1+deb.sury.org+2) ...
Selecting previously unselected package php8.0-zip.
Preparing to unpack .../php8.0-zip_8.0.3-1+ubuntu20.04.1+deb.sury.org+1_amd64.deb ...
Unpacking php8.0-zip (8.0.3-1+ubuntu20.04.1+deb.sury.org+1) ...
Setting up libzip4:amd64 (1.7.3-1+ubuntu20.04.1+deb.sury.org+2) ...
Setting up php8.0-zip (8.0.3-1+ubuntu20.04.1+deb.sury.org+1) ...

Creating config file /etc/php/8.0/mods-available/zip.ini with new version
Setting up php8.0-imagick (3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1) ...
Setting up php-imagick (3.4.4+php8.0+3.4.4-7+ubuntu20.04.1+deb.sury.org+1) ...
Processing triggers for php8.0-fpm (8.0.3-1+ubuntu20.04.1+deb.sury.org+1) ...
NOTICE: Not enabling PHP 8.0 FPM by default.
NOTICE: To enable PHP 8.0 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php8.0-fpm
NOTICE: You are seeing this message because you have apache2 package installed.
Processing triggers for libapache2-mod-php8.0 (8.0.3-1+ubuntu20.04.1+deb.sury.org+1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
Processing triggers for php8.0-cli (8.0.3-1+ubuntu20.04.1+deb.sury.org+1) ...

# Apacheの再起動
$ sudo systemctl restart apache2

関連パッケージなどもインストールされて完了!

【謎3】謎1が復活

どうやら、表示されたりされなかったりのようです。

  • /var/www/html/xxxxxxx/wp/wp-content/themes/luxeritas/inc/thk-mod-class.php
  • /var/www/html/xxxxxxx/wp/wp-content/themes/luxeritas/inc/wpfunc.php

これら二つのファイルを参照した時のみ表示されるようですね。

ダッシュボートに戻ったら表示は消えてました。

まあ、Deprecatedなのでのんびりやりましょ。

とりあえず目的は達成された

まあ、まだいろんなことを試してない段階ですが、PHP8.0と7.4を切り替えながら利用するという環境は構築できました。

ワードプレスでは、本体はPHP8.0に対応していくとして、プラグインやテーマについては慎重に見極める必要があるでしょう。やはり更新頻度の低いものは淘汰されるべき、ということになるでしょう。

では今回はここまで!!!!