PHP
PHP(Hypertext Preprocessor)は、ウェブ開発に適したオープンソースのスクリプト言語です。サーバーサイドで動作し、クライアント(ブラウザ)にコードを送信する前に、ウェブサーバー上でコードを処理します。WordPressはPHPで構築されているため、WordPressサイトにはPHPが欠かせません。PHPにより、以下のことが可能になります。
- 動的コンテンツを生成し、リアルタイムでウェブサイトに表示
- データベースと連動し、データを取得・保存
- フォームを扱い、ユーザー入力を処理して、インタラクティブ性を確保
- テーマやプラグインでWordPressコア機能を拡張
- コンテンツがユーザーのブラウザに届く前に、ウェブサーバー上で多くの処理を行いパフォーマンスを改善
PHPの処理
訪問者がキャッシュされていないページにアクセスしたり、ページ上で操作(商品を買い物カゴに入れる、フォームを送信するなど)を実行すると、以下のような処理が行われます。
- ウェブサーバー(弊社ではNginx)がリクエストを受け取る
- NginxがリクエストをPHPに渡し、PHPは利用可能なPHPスレッドに割り当てられる
- PHPスレッドがPHPスクリプトを実行(データベースからのデータ取得やフォーム処理など)
- スクリプト実行中にPHPスレッドがサーバーのメモリの一部(弊社で設定されたPHPメモリ上限まで)を使用
- 複数の同時リクエストがある場合、各リクエストは異なるPHPスレッドに割り当てられる(すべてのスレッドがビジー状態である場合、追加のリクエストは待機)
- PHPがテーマのPHPファイル(および該当する場合はプラグインファイル)を使用してHTMLページを生成
- PHPがレンダリングされたHTMLページをウェブサーバーに返す
- 訪問者にページが表示される
キャッシュを使用していない、またはサイトが最適化されていない場合、PHPスレッドが長時間ビジー状態になることで、パフォーマンスが低下したり、訪問者にタイムアウトや503/504エラーが発生したりする可能性があります。PHPのパフォーマンスを確認して、PHPスレッドを最適化する方法はこちらをご覧ください。
PHPスレッド
PHPスレッド(以前はワーカープロセスとして知られる)は、ウェブサイトへのリクエストを処理する個々のワーカープロセスです。各スレッドは一度に1件のリクエストを処理します。スレッドが2つある場合は、同時に2件のリクエストを処理することができます。これにはページの構築、バックグラウンドタスクの処理、データベースへのクエリなどが含まれます。
PHPスレッドは、1件のリクエストの処理(ページのレンダリングやデータベースからのデータ取得など)を終えると、次のリクエストを処理できるようになります。
PHPスレッドが必要になるのは、コンテンツの多くをキャッシュしていない、あるいはキャッシュできない場合です。サイトが動的であればあるほど、通常より多くのPHPスレッドが必要になります。キャッシュされたコンテンツの提供にPHPスレッドは不要で、情報の取得や変更のためにデータベースに問い合わせなければならない場合のみ、PHPスレッドが必要になります。サイトを適切に最適化すると、リクエストは素早く処理され、PHPスレッドを効率的に解放して次のリクエストに備えることができます。
PHPスレッドを最適化する方法はこちらをご覧ください。
各プランに含まれるPHPスレッド数
弊社の各プランにデフォルトで含まれるPHPメモリプール、スレッド数、スレッドあたりのメモリ上限は以下のとおりです。
プラン | プールサイズ | スレッド数 | スレッドあたりのメモリ |
---|---|---|---|
Single 35k | 512MB | 2 | 256MB |
Single 65k | 1GB | 4 | 256MB |
Single 125k | 1.5GB | 6 | 256MB |
Single 315k | 1.5GB | 6 | 256MB |
Single 500k | 2GB | 8 | 256MB |
Single 750k | 2GB | 8 | 256MB |
WP 2 | 512MB | 2 | 256MB |
WP 5 | 1GB | 4 | 256MB |
WP 10 | 1GB | 4 | 256MB |
WP 20 | 1.5GB | 6 | 256MB |
WP 40 | 1.5GB | 6 | 256MB |
各サイトのPHPスレッド数を変更するには、「WordPressサイト」>(サイト名)>「PHPパフォーマンス」セクションの「変更する」をクリックしてください。
以下のプランでは現在、PHPパフォーマンスアドオンやPHPメモリプール総量を行うことはできませんが、それぞれ以下の数のPHPスレッドがデフォルトで含まれます。
プラン | サイトあたりのPHPスレッド数 |
---|---|
Single 1.25M | 10 |
Single 1.9M | 12 |
Single 2.5M | 14 |
Single 3.15M | 16 |
WP 60 | 8 |
WP 80 | 10 |
WP 120 | 12 |
WP 150 | 14 |
Agency 20 | 6 |
Agency 40 | 6 |
Agency 60 | 8 |
PHPメモリ上限
PHPメモリ上限は、各PHPスレッドがリクエスト処理中に使用できるメモリ(RAM)の最大量です。
PHPスクリプト(特にWordPress)は、大きなデータベースクエリやメディアアップロードのようなメモリ集約型のタスクでは、使用可能なメモリをオーバーしてエラーを引き起こす可能性があります。これは、サイトを構成する際に考慮すべき重要な点になります。
スクリプトがメモリ上限を超えると、エラーが発生します(「Allowed memory size exhausted(許容メモリサイズを超えました)」エラーなど)。これにより、1つのスクリプトがサーバーのリソースを過剰に消費するのを防ぐことができます。
各プランのPHPメモリ上限
Single 35k、65k、125k、315k、500k、750k、WP 2、5、10、20、40プランのPHPメモリ上限は256MBです。これはほぼすべてのWordPressプラグインとサイトには十分な値です。Single 1.25M、1.9M、2.5M、3.15M、WP 60、80、120、150、およびAgency 20、40、60プランのメモリ上限は512MBです。PHPメモリ上限はPHPスクリプトがメモリの過剰消費を防ぐために設定されるものであり、上限を高く設定し過ぎると、誤った設定や壊れたスクリプトがメモリを消耗しすぎて深刻な問題を可能性があります。
サイトのPHPメモリ上限を変更するには、「WordPressサイト」>(サイト名)>「情報」>「PHPパフォーマンス」セクションの「変更する」をクリックしてください。
PHPスレッドとメモリの相互作用
PHPスレッド数とPHPメモリ上限は異なるものです。PHPスレッドは、送られてくるリクエストを処理する個々のワーカープロセスを意味します。これに対して、PHPメモリ上限は、単一のPHP スクリプトが実行中に使用できるメモリ(RAM)の最大量を定義するものです。
PHPスレッドは、複数のリクエストを同時に処理することで並行性を管理するものですが、PHPメモリ上限は、個々のスクリプトのメモリ使用量を定義することでリソースの割り当てを管理します。これにより、単一のスクリプトがサーバーで使用可能なすべてのメモリを消費することを防ぎます。
PHPメモリ上限は、大規模なデータベースクエリの実行やファイルアップロードの処理、複雑な計算の実行など、大量のメモリを必要とするスクリプトにとって重要です。サイトでメモリ上限エラーが発生した場合は、PHPスレッドの数を増やしても解決されません。「WordPressサイト」>(サイト名)>「情報」>「PHPパフォーマンス」セクションの「変更する」をクリックし、スレッドあたりのメモリを増やす必要があります。
PHPスレッド、CPU、RAM間の相互作用
PHPスレッドを追加する際には、CPUおよびRAMのリソースを考慮する必要があります。スレッドの数を増やしても、サーバーがそのスレッドをサポートするために多くのCPUやRAMを必要とする場合は、リクエストを効率的に処理することができず、ボトルネックになります。
弊社独自のLXDコンテナは、それぞれ12個のCPUと8GBのRAMで構成されています。Google Cloudの最速CPUを搭載しコンピューティングに最適化されたC2およびC3D仮想マシンを使用して、PHPスレッドをより効率的に実行します。スケーラブルなインフラストラクチャにより、WordPressサイトのPHPスレッドが最高のパフォーマンスで動作するのに十分なCPUリソースが確保されます。
PHPのデフォルト値
WordPress向けのマネージドサービスを提供する企業として、WordPressサイトで最適に動作するように構成されたPHP設定を行っています。特定のPHP要件をお持ちのお客様は、弊社カスタマーサポートまでお気軽にお問い合わせください。
弊社では現在、PHP 7.4、8.0、8.1、8.2、8.3、8.4をサポートしています。PHPのデフォルト設定は以下のとおりです。
- memory_limit = 256M
- post_max_size = 128M
- upload_max_filesize = 128M
- max_input_vars = 10000
- max_execution_time = 300