2021年3月5日金曜日

WordPress プラグイン「WP-FFPC」を PHP 8.0で動かす!

 WordPress で PHPキャッシュ(APCu等)を有効化するプラグイン「WP-FFPC」ですが、PHP 8.0 ではエラーがでてサイトが止まってしまいます。PHP 7.4 では動きます。PHP の APCu モジュールは、さくらインターネットのレンタルサーバー等、APCu モジュールが使える PHPで有効化するとサイトのパフォーマンスがかなり上がる無くてはならないものです。それが PHP 8.0になるとサイトが止まってしまうのは大問題です。

そこで WP-FFPC 1.11.2 (2021年3月5日時点)を修正して問題を解決してみました!その備忘録をまとめておきます。

PHP 8.0.0 上で、WP-FFPCをインストールすると・・・


有効化するまえに、下記のエラーでサイトが止まります。

これらを参考にソースコードをチェックした結果、下記の赤文字の部分の問題があることがわかりました。どのような問題かは後述します。

wp-ffpc-class.php
1016-1018行目

public function plugin_options_migrate( &$options ) {

if ( version_compare ( $options['version'], $this->plugin_version, '<' )  ) {


問題を解決する方法


この 1017行目に
if($options === false) $options = array('version' => '0.0');
を追加することで本問題を回避できます。
実際には、下記の青のコードを追加するということです。
	public function plugin_options_migrate( &$options ) {
		if($options === false) $options = array('version' => '0.0');
		if ( version_compare ( $options['version'], $this->plugin_version, '<' )  ) {

原因の説明


これはプログラムのバグです。
wp-ffpc-abstract.php
514行目から
public static function _get_option ( $optionID, $network = false ) {
if ( $network ) {
static::debug ( sprintf( __( '- getting network option %s', 'PluginUtils' ), $optionID ) );
$options = get_site_option( $optionID );
}
else {
static::debug( sprintf( __( ' – getting option %s', 'PluginUtils' ), $optionID ));
$options = get_option( $optionID );
}

return $options;
}
において、 戻り値の $options は、false (bool値), 配列等いくつかのパターンがあり、最初にインストールするときに、WP-FFPCの設定が WordPressで利用するデータベースに存在しないことから、$options の値が false (bool値)となります。

そうすると、下記の $options['version'] が存在しないことになり (falseとなる)、version_compare の第1引数が false になります。しかし、version_compare は引数に string を期待しているため、型の不一致が起こります。PHP 8.0からはそうした場合にはエラーになるということです。

wp-ffpc-class.php
1016-1018行目

public function plugin_options_migrate( &$options ) {

if ( version_compare ( $options['version'], $this->plugin_version, '<' )  ) {


このバージョンチェックは、WP-FFPCプラグインのバージョンが、インストール前のバージョンよりも新しければというチェックをしています。つまりプラグインが更新したときの処理でしょう。そのため、初期値を 0.0 にすることで、最初にインストールしたときには、必ずこのチェックが真になるように、下記のように比較前にコードを追加してあげればよいです。
if($options === false) $options = array('version' => '0.0');

これでエラー無く動くので、あとは一度でも WP-FFPCの設定を保存すれば、以後は $options が false になることはないはずです。

開発者の GitHUBに ISSUEとしてあげておきました。

さらに WordPress.org のプラグインサポートのほうにも投稿

修正されることを祈っておきます!

付録A) APCu キャッシュを有効にできる他のプラグイン等について


なかなか思うようなプラグインには出会えず。

  • Power Cacheプラグイン: https://ja.wordpress.org/plugins/powered-cache/
    • ドロップインに追加されるが、エラーがでてしまっている。wp-content/object-cache.php → wp-content/plugins/object-cache.php  へシンボリックリンクを張れば動く。



  • APC Object Cache Backendプラグイン:https://wordpress.org/plugins/apc/
    • PHP 8.0では重大なエラーがでて有効化できず

付録B)  Deprecated: contextual_help の使用はバージョン 3.3.0 から非推奨になっています ! への対応


作成:2021年3月8日

Deprecated: contextual_help の使用はバージョン 3.3.0 から非推奨になっています ! 代わりに get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab() を使ってください。 in /****/wp-includes/functions.php on line 5234

これは、wp-admin/ 以下の管理画面の上部にヘルプタブに追加する機能のようです。
が使い方が書かれていますが、結構修正は大変のように見えます。
これなくても機能としては問題ないため

wp-ffpc-class.php
 add_filter('contextual_help', array( &$this, 'plugin_admin_nginx_help' ), 10, 2);
//  add_filter('contextual_help', array( &$this, 'plugin_admin_nginx_help' ), 10, 2);

wp-ffpc-abstract.php
 add_filter('contextual_help', array( &$this, 'plugin_admin_help' ), 10, 2);
// add_filter('contextual_help', array( &$this, 'plugin_admin_help' ), 10, 2);

とコメントして無効化しておけば、とりあえず問題なさそうですね。


2021年3月5日 @kimipooh
2021年3月8日 付録2) を追記

0 件のコメント:

コメントを投稿