WordPressとPHP8–互換性とメリット!
公開: 2021-01-04ほとんどの技術オタクはPHP8.0に興奮しており、確かに今回の変更は非常に大きなものです。 誰もがPHP8の互換性、構成、利点などを理解するために時間を費やすでしょう。とりわけ、ポップアップする最大の質問の1つは、「WordPressはすでにPHP 8と互換性がありますか、そうでない場合は、どのような行動が必要か。」
さて、PHP 8がリリースされるとすぐに、私たちの専門家の時間が最も深いレベルのテストに飛び込み、その結果は誰にでも衝撃を与える可能性があります! はい、私たちは今すべてを知っており、試飲の報告と結果を誇示する喜びを感じています。
すべてが変更されたことを示すだけでなく、PHP8に更新する必要があるかどうかに関する純粋なアドバイスも提供します。
PHP 8での非常に多くの重大な変更:しかし、なぜですか?
PHP 8はPHPの巨大なアップデートであり、最近のマイナーバージョンの範囲からメジャーバージョンのネガを削除するのが一般的な方法です。 話題のPHP8では、以前の7.*バージョンでいくつかの重大な変更が削減されました。
したがって、何年にもわたって注意深く更新され、非難されたAPIを修正したプロジェクトの場合、アップグレードするのは難しいことではありません。 実を言うと、PHP 7. *バージョンでは、以前のバージョンのPHPとは対照的に、はるかに多くの非推奨が見られました。
PHP5.6からPHP7への移行は非常に単純でしたが、7.xから8への移行は、特にWordPressを含む古いコードベースでは、いくつかの利用可能なプラグインに加えて、やや苦痛になる可能性があります。
確かに、適切に型指定されたコードベースまたは最新のPHPバージョンを備えた最新のコードベースの場合、大きな問題は発生しません。 ただし、実際には、WordPressはそのようなコードベースではありません。
WordPressはすでにPHP8と互換性がありますか?
正直に言うと、WordPressはすでにPHP 8と互換性がありますが、それらの単語を封印することはできません。 WordPressは、常に最新バージョンのPHPと互換性があることを目標としています。 ただし、このガイドの後半で最大の懸念事項を詳細に分析しました。
利用可能な戦略を使用して見つけることができる互換性の問題の大部分の完璧な修正を見つけることに関して、私たちは驚くべき仕事をしました。 私たちは確かに、そこにあったものすべてとそれらに存在する問題についてさらに深く掘り下げます。
どのようなパフォーマンスの変更が予定されていますか?
PHP 8に搭載されている潜在的にエキサイティングな主な機能は、JIT(Just In Time)のコンパイルとデバッグです。 ご存知のように、PHPはインタプリタ言語です。つまり、実行時にマシンコードに翻訳されます。
JITは、頻繁に使用されるコードを追跡し、マシンコード変換を最適化して再利用できるようにします。 現在、これにより、特定の機能のパフォーマンスが大幅に向上する可能性があります。
JavaScriptなどのさまざまな言語にJITを含めることは、歴史的に新しいアプリケーションの爆発的な増加をもたらしました。 たとえば、JSで実行されている仮想マシンは、Webの初期には想像を絶するものでした。 これまでサーバーにモジュールをインストールする必要があったいくつかのタスクは、コアPHPライブラリを使用して実用的になります。
当面の間、WordPressなどのWebアプリの実際のパフォーマンスの向上はごくわずかです。 それに加えて、開発者や平均的なWordPressユーザーがこの新機能の利点を享受するまでには、膨大な時間がかかります。
開発者の生活を楽にする他のいくつかの新機能があります。 近い将来、これらがWPテーマとプラグインで使用される可能性は低いです。これは、大部分が、いくつかのWordPressサイトでまだ使用されているPHPの以前のバージョンとの互換性を損なうためです。
WordPressサイトのPHPを更新する方法は?
このガイドでは、WordPressサイトを壊すことなく、PHPを最新バージョンに更新するのにどれほど便利かを説明します。
パスを知りたい場合は、現在のPHPバージョンを確認してから、WordPressを最新バージョンに更新してください。 その後、「one.com PHPスキャナー」をインストールし、スキャンを実行して潜在的な問題を修正します。 さらに、PHPを最新バージョンに更新し、サイトが期待どおりに機能しているかどうかを確認します。
プロセス全体を示しましょう。
ステップ1:現在のPHPバージョンを確認する
最初に、現在使用しているPHPのバージョンを確認する必要があります。 Webサイトの現在のPHPバージョンの情報は、 phpinfoページから取得できます。
cPanelで実行している場合は、cPanelでPHPバージョンを表示および変更する方法の記事からPHPバージョンを表示できます。
PHPバージョン7.3以降を使用している場合は、すべて問題ありません。 PHP 7.2を使用している場合は、更新が必要です。 手順2を大切にしてください。
ステップ2:WordPressを最新バージョンに更新する
誤動作を本当に避けたい場合は、WordPressコアとすべてのプラグインとテーマが最新バージョンに更新されていることを確認してください。
- WordPress管理者にログインし、[ダッシュボード] >[更新]をクリックします。
- WordPressの最新バージョンがインストールされているかどうか、およびすべてのテーマとプラグインが最新であるかどうかを確認してください。 今すぐWordPressを最新バージョンに更新してください。
ステップ3:「one.comPHPスキャナー」をインストールします。
- WordPress管理者で、 one.com >プラグインをタップします。
- one.com PHPスキャナーを見つけて、 [今すぐインストール]をタップします。
- 次に、[アクティブ化]をクリックして、次の手順に進みます。
ステップ4:スキャンを実行して潜在的な問題を修正する
- 左側のメニューで、 PHPスキャナーをタップします。
- PHPバージョン7.4をタップし、次に「すべてのテーマとプラグイン」をタップしてから、「スキャンの開始」をタップします。
- スキャンが終了したら続行できます。
- 次の3つの結果が得られます。
–互換性=それはすべてが良いことを意味します!
–警告=動作するはずですが、次のPHPバージョンで問題が発生する可能性があることを意味します。
–エラー=あまり良くないので、更新後に問題が発生します。
エラーを読み取るテーマまたはプラグインを最新バージョンに更新するか、同じ機能を提供する代替プラグインに置き換えることで修正します。
ヒント:定期的に更新され、最新バージョンのWordPressとの互換性の問題が発生しないプラグインを使用するプラグインのみを使用することをお勧めします。 それ以外に、サイトのパフォーマンスを向上させるために、不要なプラグインを削除することをお勧めします。
ステップ5:PHPを8.0バージョンに更新します
これで、PHPを更新する準備が整いました。 PHPエラーメッセージを同時にオンにすることをお勧めします。 コードに問題がある場合は、原因と正確な場所を示すエラーメッセージが表示されます。
- コントロールパネルで、 PHPとデータベースの設定に戻ります。
- PHPエラーメッセージまで下にスクロールします。
- エラーメッセージをオンに設定した後、 [更新]をクリックします。
- このすぐ下で、バージョンを変更して[更新]をタップします。
手順6:Webサイトが期待どおりに機能しているかどうかを確認します。
これで、PHPバージョンが更新され、変更が適用されるまでに最低20分かかります。 サイトに多くの訪問者がいる場合、時間枠は数時間にも及ぶ可能性があります。 これが、今後24時間以内に少なくとも数回Webサイトをチェックすることをお勧めする理由です。
サイトが期待どおりに機能しない場合、最も可能性の高い問題はテーマまたはプラグインです。 問題を正確に引き起こしているものを見つけるには:
- 一時的にデフォルトのWordPressテーマに切り替えます。「TwentySeventeen」と言います。
- インストールされているすべてのプラグインを選択し、それらを完全に非アクティブ化します。
- テーマとすべてのプラグインを1つずつ再度有効にし、サイトがまだ機能しているかどうかを毎回確認します。 この方法で犯人を捕まえることができます。
技術的に言えば、WordPressの現在の夜と非常に議論されているPHP 8との互換性は、新しいバージョンのPHPがポップアップする直前のWordPressリリースからの互換性と同じレベルです。
私たちのテストはかなり充実しており、修正は細心の注意を払っており、トラブル修正のレベルは、WordPressコア内のPHP互換性修正と同じくらい巨大でした。 ただし、このガイドに従わないと、互換性の課題を理解できず、PHP8から最大のメリットを得ることができません。
クロスバージョンツールにいくつかの複雑さが加わったことに加えて、PHP 8に含まれる膨大な量の重大な変更と種類の変更により、この互換性の課題は、以前のバージョンのPHPで経験したことよりも大きな獣になります。 このレポートは、同じケースを説明することを目的としています。
WordPressとPHP8の互換性の課題
既存のコードベースをPHP8と互換性のあるものにするためにデプロイできるいくつかの戦略を紹介します。
- 構文上の問題を検出するためのPHPCompatibilityなどの静的分析ツール。
- 実行時の問題を検出するための自動テスト。
- 実行時の問題を検出するための手動テスト。
テストスイートの適用範囲と構文の変更および実行時間の割合に応じて、これらの戦略は、コードベースと新しいバージョンのPHP(現在はPHP 8について説明しています)との互換性を修正するのに役立ちます。
確かに、PHP 8とWordPressの場合、WordPressとPHP 8の完全な互換性を確保するために、これらの戦略に依存することを困難にするいくつかの追加の課題があります。以下に、展開した戦略について報告します。 WordPressの場合、結果を共有します。
静的分析ツール
PHP 8.0でのいくつかの変更の性質上、静的分析を使用して検出できる問題は限られています。 静的分析が従来の可能性を超えて、変数と定数の値および実行時のタイプを追跡することを計画している状況では、そのようなスキャンの結果は確かに誤検知の傾向があります。
その上、PHP互換性は、PHPクロスバージョン互換性関連の問題を見つけることを目的とした唯一の静的分析ツールです。
PHPの互換性に加えて、他の静的分析ツールはより広い範囲の問題について報告します。 PHPのバージョン間の互換性に関連し、実際に正しい問題を検出するために結果を大切にすることは、かなり時間がかかり、特に最小のノイズ量でそれらを構成することについて、ツールに関連する深い知識が必要です。
同時に、これらのツールは常に不安定であり、PHPバージョンの変更に対応し、可能なスキャンを更新しようとしています。 したがって、これらのツールは、今後さらに多くの問題を検出することが期待できます。
したがって、これまでの内容とは関係なく、現時点でさらに見つけることができますが、これらのツールは(近い)将来もさらに多くの問題を見つける可能性があります。
PHPCompatibilityでWordPressをスキャンする
「__destruct()は__construct()のdie()の後に呼び出されなくなります」は、PHPCompatibilityによって発見されたもう1つのPHP8の問題です。 これはスキャナーによって完全に検出されます。 ただし、さらに分析したところ、この場合は問題がないことがわかりました。
さらに、PHPCompatibilityは、「プラグイン/テーマエディタ」で使用されるコードの問題を検出しました。 関与するコードの分析により、コードに根本的な見落としが存在することが判明しました。 エディターでは、WordPressはコードの最小限の分析を行うことを楽しみにしています。 ただし、PHP5.3以降のコードは考慮されていません。
PHP8の関連する変更を考慮に入れながら、この見落としは解決がより複雑になりました。 開発したバージョンでPHPCompatibilityを使用してスキャンを実行したところ、予想どおり、以前のPHPの更新で得られた結果とは大きく異なりました。 スキャナーによって検出された問題は外部で維持されます。
ExakatでWordPressをスキャンする
WPトランクに基づいて10月16日に行われた最新の公開スキャンについて話すと、 Exakatは合計149.567の問題を報告しています。
PHP 8互換性レポートには、合計93の問題が示されています。 ただし、PHP 8に関連する分析番号がレポートに含まれていないため、不完全です。
WordPressは型宣言を使用しないため、これらのレポートには多数の誤検知が含まれると予想されます。したがって、検出されたコードとdocblockに表示される型から型が推定されますが、これらの問題は個別に調査する必要があります。

見つかった問題のわずか1%が正しいとしても、それでも約450のエラーに減少しますが、それでも対処する必要があります。 それに加えて、誤検知から本物の問題を取り除くために必要な多大な時間。
PHPStanでWordPressをスキャンする
PHPStanを使用したスキャンでは、リモートで使用可能な結果を得るには完全にカスタマイズされたルールセットが必要ですが、それでも、いくつかの誤検知が発生し、出力が使用できなくなります。
注:PHPStanツールを批判しているわけではありませんが、WordPressが型宣言をほとんど使用していないのに対し、PHPStanは主に最新のコードを使用するプロジェクトに傾倒しているためです。
最も基本的な構成で構成される最初のスキャンでは、20.000以上の問題が発生します。 特にPHP8関連の問題を対象とした、高度にカスタマイズされた上記のルールセットを使用したスキャンでは、レベル5で正確に580の問題が発生し、レベル7で追加の2.150の潜在的な問題が発生する可能性があります。レベル8でも同様の注意が必要です。
不明な構成に基づいて問題のリストに対処するためにTracチケットが最近開かれましたが、完全にターゲットにされたパラメータータイプの不一致(レベル5)が渡されました。 これらの問題を修正するためにドラフトPRを利用できます。
このPRの知覚的評価は、提案された修正のほとんどが、変数を期待される型に型キャストして問題を隠すことを示しており、適切にチェックして実際に修正することはありません。 これらの変更に厳密な単体テストが伴わない場合、これによりアプリケーションで予期しない動作が発生します。 それに加えて、titは、確実にエラーをデバッグしている間、難易度を上げる結果になる可能性があります。
現在、提案された修正が正当であるかどうか、または特定された問題を誤検知として観察する必要があるかどうかは確認されていません。
テスト
PHP8の問題のあるスワップの性質により、静的分析はこれまでのところうまくいく可能性があります。 ソフトウェアを手動でレビューしてテストすることは、そのような骨の折れる作業であることがわかります。また、注意すべきことがたくさんある場合、人間は物事を見落とす傾向があります。
ここで、エンドユーザーが実行するテストについて話すと、通常は「ハッピーパス」がテストされるため、エンドユーザーは比較的役に立たないことがわかります。 より信頼性の高い結果を達成したい場合は、包括的な探索的および回帰テストが必要です。
高品質の自動テストを行い、PHP8でこれらを実行することは何よりも重要です。 これにより、PHP8.0の問題が完全に示されます。
ほとんどの技術オタクはPHP8.0に興奮しており、確かに今回の変更は非常に大きなものです。 誰もがPHP8の互換性、構成、利点などを理解するために時間を費やすでしょう。とりわけ、ポップアップする最大の質問の1つは、「WordPressはすでにPHP 8と互換性がありますか?そうでない場合は、どのようなアクションですか?必要です。」
さて、PHP 8がリリースされるとすぐに、私たちの専門家の時間は最も深いレベルのテストに飛び込み、その結果は誰にでも衝撃を与える可能性があります! はい、私たちは今すべてを知っており、私たちのレポートとテストの結果を誇示する喜びを感じています。
では、 PHP8での自動テストの実行に移りましょう。
PHP8で自動テストを実行する
PHPUnit 9.3は、PHP 8.0と正式に互換性のある最初のPHPUnitバージョンであり、2020年8月にリリースされました。PHPで実行される自動テストスイートの実行は、単体テスト用の事実上のツールであるため困難です。
自動化されたテストスイートをPHP8で実行することで、PHPの世界で単体テストを実行するための事実上のツールとして次のうさぎの穴を掘り下げることができます。 PHPUnitは通常、毎年大規模なリリースを行い、以前のPHPバージョンではすべてのメジャードロップがサポートされています。 重大な変更が導入されていますが、PHPUnit9.3は公式にPHP8.0と互換性があるため、前述のように、心配する必要はありません。
少なくとも、WordPressはPHP5.6をサポートしていることを私たちは知っています。 PHP 8.0でテストを実行するには、WordPressに関連するすべてのテストスイートがPHPUnit5からPHPUnit9まで完全に互換性がある必要があります。確かに、ツールはそれを支援するように構築されています。 テストスイートを互換性のあるものにするためにこれらのツールを実装するには、依然として労力と時間がかかります。
WordPressCore用のPHP8でテストを実行する
WP Coreのテストは現在、PHP 8に合格して実行されています。これらのテストは、PHPUnit7.5のcomposerがインストールされたバージョンで実行されています。 PHPUnit 9.3は、PHP8と公式に互換性のある最も古いPHPUnitバージョンですが。
この最後の問題は、選択した数のファイル/クラスをPHPUnit 9.3からWordPressテストスイートにコピーすることで解決されました。ただし、Composer自動ロード生成からPHPUnitのネイティブクラスを除外し、WordPressテストスイートでのPHPUnit9.3からのコピーの使用をサポートします。 これは今のところ機能しますが、これをハッキーなソリューションと呼びます。現在必要なメンテナンス以外に、今後は持続可能ではない可能性があります。
テストの品質のために、これは最初は確かに低く、ほとんどの場合、ルーズタイプチェックが利用されていました。
さらに深くなると、これに対処するためのTracチケットが2016年にオープンしました。PHPでのより厳密なタイプの順守を考慮して、このチケットは復元されました。 これを軽減するために多くの作業が行われてきました。
私たちが書いている間、約800のインスタンスがあります(96のassertNotEquals()に676のassertEquals()が追加されました)。 まだルーズタイプチェックを利用しています–8000以上のインスタンスから減少しています。
一部、オブジェクトを比較すると、残っていたルーズタイプのアサーションは正当です。 一部には、これらは確かに対処する必要があります。 ただし、現在、テストの失敗につながる可能性があります。 これらの最後のものは、テストのいずれかの欠点を強調していますが、よりまれに、テストされているコードの欠点を強調しています。
テーマとプラグインのテスト
利用可能なプラグインはごくわずかであり、専門的に開発されたものであり、より人気があり、自動テストが実施されています。 一般的に言って、通常のWordPressサイトは確かに19または20近くのプラグインを実行しているので、これは気になります。 かなりの数のサイトがさらに多くのプラグインでロールオンしています! テーマの自動テストを実施することはさらにまれです。
これらのテストスイートをPHPバージョン8で実行できるようにすることは困難です。また、プラグインとテーマのPHP8との互換性に関する洞察を得る前に。
ただし、プラグイン/テーマは、ほとんどの場合、PHP8.0の問題の最小量が期待できるものです。 そのようなテーマ/プラグインは専門的な開発モデルを使用しているので、私たちはそう叫びます。
より大きな懸念の原因は、 PHP 8で実行しているときに問題が発生しやすいため、テストとテストなしのテーマが多数あることです。
テストがあるテーマとプラグインの場合、主に2種類のテストがあり、適切に配置されている場合とされていない場合があります。
- ユニットテスト。 プラグインコードのテストを許可するためにWPを「派生」させるスタンドアロンテスト。 BrainMonkeyやMockeryなどの人気のあるフレームワークが使用されています。
- 統合テスト。 現在、統合テストでは、テストスイートを実行する前にWordPress自体が読み込まれ、WPcoreコードを使用して、WPテストスイートと統合されます。
統合テスト
WordPressがPHPUnit7.5に固執することを決定したことはわかっています。 どういう意味ですか?
さて、テーマとプラグインの統合テストでは、それらもPHPUnit 7.5(最大)にジャンプします。
テーマとプラグインは、統合テストを完全に実行するためにWPコアのハックをコピーするか、あるいはWPコアのファイルを使用する必要があります。 ただし、同じComposerオートロード生成ハックは使用できないため、カスタムオートローダーを作成する必要があります。
PHPUnitネイティブファイルがロードされないようにする必要がある場合は、Composerオートロードファイルの直前にそのようなカスタムオートローダーを確実にブートストラップする必要があります。
ユニットテスト
MockeryまたはBrainMonkeyを使用した単体テストの場合、PHPUnit7.xで使用可能なMockeryフレームワークはPHP8.0と互換性がないため、PHPUnit>8が必要です。 したがって、これらのテストスイートの比較可能性はPHPUnit 5から9までで必須であり、これは確かに別の課題を追加します。
どのように?
両方の種類のテストスイートが使用されている場合、各テストスイートを実行するには、異なるバージョンのPHPUnitが必要です。 この状況を悪化させるために、プラグインには通常、コミットされたcomposer.lockファイルがあり、実行時の依存関係が信頼できる特定のバージョンであり、PHP5.6と完全に互換性があることを確認します。
場合によっては、この最後の部分は、composer.jsonファイルにプラットフォームphp5.6の種類の構成を含めることによって強制されます。 これは、開発依存関係のBrainMonkey、Mockery、PHPUnitも、PHP5.6と互換性のあるバージョンでロックされることを意味します。 さて、それは確かにPHP8.0でのテストの実行を妨げるでしょう。
これは、composer.lockファイルとcomposer.jsonを更新するだけでなく、プラットフォームをオンザフライで削除することで克服できます。 ただし、これにより、開発者にとって、PHP8.0でのテストの実行がCIとローカルの両方でより複雑になります。
PHP 8の互換性は、大規模なWordPressサイトではやや注意が必要です。
PHP 8の一連の重大な変更を調査するだけで、これがサイトで大規模な破損を引き起こす傾向があり、その破損の理由が不明であることが確認できました。 場合によっては、エラーは1つの場所で発生しますが、別の場所のテーマまたはプラグインによって生成されます。amdは、これらの問題のデバッグをかなり困難にします。
accuwebhosting.comは確かに積極的に維持されているWordPressサイトであり、プロの開発者の専任チームがそれをサポートしています。 WordPressサイトの大多数にはそのような贅沢はなく、これらのサイトの互換性の問題を軽減することは確かに挑戦的です。
開発者はどのくらい更新する必要がありますか?
PHPの各バージョンのライフサイクルは2年であり、この時代にバグが修正されています。 セキュリティの問題にパッチが適用される1年が追加されます。 PHP7.4は2019年11月にリリースされました。これはPHP7の最終バージョンでした。つまり、PHP7.4のバグは2021年11月まで修正される予定です。セキュリティの問題は2022年11月まで修正されます。「サポート終了」に達します。その時点で。
したがって、ハードカットオフ日は2022年11月です。この時点までにすべてのPHPコードがPHP 8と互換性がある必要があります。そうしないと、潜在的に脆弱なPHPバージョンでスタックする危険があります。
結論
PHP 8には、多くの重大な変更が含まれます。 レポートでは、これらの変更のかなりの範囲について説明しました。専門家は、より広範なWordPressエコシステムに加えて、WordPressにさらに大きな影響を与えると想定しています。 それらは一般的に問題になる警告に対処しなければなりません。 また、いくつかのエラーが発生しますが、これは対処が難しい場合があります。 実行時にこれらの変更のより高い割合を検出できます。
これらの互換性の問題をすべて修正することは大きな作業です。 これを実現するには、静的分析から自動テストまで、さまざまな戦略を使用する必要があります。 それには膨大な時間と労力が必要です。
あなたはすべてを完璧に行うためのツールを使う権利を持っているべきです。 さまざまなPHPバージョンをサポートする必要があるWordPressなどのプロジェクトでは、前述のように、分析ツールのさまざまなバージョンを調整する際に、いくつかの追加の複雑さが導入されます。
確かに、PHP 5と8の実行時間と構文の違いが非常に大きいため、かなり難しくなります。
WordPressでPHP8を使用するのは良いですか? 実際、ここでの議論ではありません。 ここでの唯一の結論は、そうすることは非常に困難になるということです。
また、カバレッジとWordPressのPHP依存関係の問題についても検討しました。 互換性を確実に検出したい場合は、高いテストカバレッジが必要であることがわかります。 また、PHP 8について言えば、互換性の問題の数が通常よりも多いため、さらに重要です。 それらの大部分は、実行時に検出できます。
それで、私たちは何をアドバイスしますか?
問題が検出された場合、WordPress、テーマ、プラグイン、またはPHPの互換性に直接関連付けられているかどうかに関係なく、問題の原因を見つけるために広範なデバッグが必要です。
テストカバレッジは、依存関係がほとんどなく、低いためです。 したがって、本当の意味でのWordPressコアとPHP8との互換性を説明するのは難しいです。
PHP 8は厳密なタイピングに非常に集中しているため、WPのタイプの安全でない拡張システムは問題に対して非常に脆弱になり、プラグインが他のプラグインまたはWP自体でタイプエラーを生成する可能性があります。
先月、エラーデータの分析を実行して、これをテストしました。 巨大なサイトとして、私たちはそれが私たちが期待できる種類の問題の強力な兆候を与えるかもしれないと考えました。 確かに、PHP8でエラーに発展するいくつかの警告が見つかりました。
ここで最後のメモを作成することをお勧めします。 利用可能なレガシーコードベースはWordPressだけではありません。 また、PHPの膨大なバージョンをサポートすることを目的としたプロジェクトはこれだけではありません。 この記事の情報は、他のプロジェクトにも当てはまる可能性があります。
Accuwebのこの記事の主な目標は、 WPでのPHP8の互換性に関連する課題と問題の概要を通知して作成することです。 それがこの目的に完全に役立つことを強く望んでいます。