[重要]WC8.6以降のWC_Logging における不具合について

先日より、弊社のクライアントから決済周りも含めてバグが発生しており、その原因が分かりましたので、情報を共有します。

WC8.6 の更新内容

今回のwc8.6 の更新内容に関しての詳細は以下の記事を見てもらえたらと思います。

今回のアップデートの目玉は2つありまして、商品ページのブロック化がかなりできましたよという点とWC_Logging の更新です。

今回の更新でWC_Loggingがかなり使いやすくなったことはリアルに素晴らしいことです。

なのですが、一部サーバーの設定では、ログが取れなくなり Fatal Error を起こして、想定した機能が発揮しない状態が発生しております。弊社のクライアントは決済が動かなくなるという事態となり、原因究明に2日ほど要してしまいました。

そのため、原因と対策の共有をこの記事でおこなっております。

原因は PHP のバージョンと FS_METHOD の設定

少し難しい話になるのですが、PHP8.0 から warning error から fatal error に変更になったエラーが存在します。今回、そのエラーが基本的には原因です。ですので、PHP8.0以下の場合は発生しません。

しかし、現在 PHP8.0 でさえ公式セキュリティサポートは、2023年11月26日に終了しています。ECのように個人情報を管理するサイトで PHP8.0 以下というのは極力避けるべき状況です。

この度の課題に関して kusanagi 開発会社のプライムストラテジーの石川さんのご協力の元に原因が判明して、私の方で現在コアにプルリクを送っております。8.6.1のアップデートに間に合わなかったため、早くて8.6.2以降に実装されるかと思います。重要性の高い案件ではないかと突いています。

https://github.com/woocommerce/woocommerce/pull/44827

修正コードが採用されるか解決するまでの対応方法

現在、対応方法は、以下の3つしかない状態です。[追記しました。]

  • 「設定」の箇所から「ログストレージ」で「データベース (ライブサイトでは非推奨)」を選択する。
  • WC_Logging を使わない。(ログ機能をオフにする。)
  • PHP のバージョンを PHP7.4 など PHP8.0 以下にする。

この記事を書いた数時間内に Woo のコミッターのCorey McKrillとメッセージのやり取りをして最適な解決策が出たので、そちらを1番目の提案にしたいと思います。今回のアップデートでログの保存をDB上に保存できるようになりました。これを選択する形が良いかと思います。

ただ、デメリットが2つありまして、ログのテーブルに接続できないというログは取ることができなくなるという点です。しかし、それ以外のログは保存されます。
あと一つは今までのログを管理画面から見れなくなる点です。ですが、設定以降のログは保存されますので、過去の分はFTPなどで見るようにするなどで対応はできるはずです。
ログストレージをデータベースに保存すれば、外部からログのテキストファイルを見られる危険性はなくなり、方法論としてはベストなのではないかと思っています。

一応、2番目と3番目でも解決は出来ますので、そちらでも現状では可能です。

正直、本番環境で利用されている場合は1番目の対応「ログ機能のオフ」がベストな対応だと思います。基本的には本番環境では管理者がしっかりとしていない状態でログを取ることはあまりお勧めしません。

ただ、テストとしてログを取りたいことがあると思いますので、その場合は PHP7.4 に下げるべきなのですが、PHP8.0 以上でのテストができないとなると、意味がない感じになりますので、開発者の方は一旦私のあげたプルリクを実装する形で対応することも方法論の一つとしては提案しますが、保証はできないことご了承ください。