企業サイトはもちろん、小規模なWooCommerceストアであっても、広告の掲載やメールの送信、期間限定のプロモーションなどにより、トラフィックが突然膨れ上がることがあります。

米国のNPRによると、2024年のブラックフライデー1日のオンライン売上は108億ドル(約1兆6,700億円)に到達し、小さなストアにも波及効果があったと言われています。普段は数百人しか訪れないようなキャンペーンが、突然数千ものユーザーが決済を行うこともあり得るということです。

Kinstaでは、そのような突発的なアクセス集中が発生するたびに、サーバープランをアップグレードする必要はありません。この記事では、一時的なアクセス集中にKinstaで賢く対応する方法3選(PHPパフォーマンスアドオン、キャッシュのフル活用、データベースの負担軽減)をご紹介します。

1. PHPパフォーマンスアドオンを使用する

アクセス集中によってサイトが圧倒される理由は、PHPのリクエスト処理能力の限界にあります。キャッシュされていないページビューや決済アクションが同時に多発すると、スレッドが積み重なりエラー発生や速度低下、カゴ落ちなどにつがなります。

PHPパフォーマンスアドオン
PHPパフォーマンスアドオン

そのような状況で役立つのが、PHPパフォーマンスアドオンです。プラン全体をアップグレードする代わりに、ピーク時に一時的にPHPスレッドとメモリ割り当てを増やすことができます。料金は日割りで計算されるため、必要時に必要な分にだけ支払い可能です。

PHPパフォーマンスアドオンでスレッドとメモリを調整
PHPパフォーマンスアドオンでスレッドとメモリを調整

たとえば小規模なWooCommerceストアで48時間のフラッシュセールを開催するとします。効果的なメールキャンペーンが成功すれば、一夜にしてトラフィックが3倍に急増することも十分考えられます。ほとんどの商品ページはキャッシュで提供されますが、決済ページはキャッシュすることができず、リクエストが一気に増加します。

十分なPHPスレッドがなければ、買い物カゴの決済処理は停滞し、注文は失敗します。ページの読み込みが遅いと、買い物客の3人に1人がカゴ落ちするという調査結果もあり、これは数十万円規模の売上損失につながります。セールの前日にPHPパフォーマンスアドオンを利用することで、アクセス増加時にも決済の流れをスムーズに保ち、セール終了後に無効化することで、必要な分だけ柔軟に利用することができます。

繁忙期終了後はPHPパフォーマンスアドオンを削除
繁忙期終了後はPHPパフォーマンスアドオンを削除

2. プランの変更前にキャッシュをフル活用する

リソースを強化する前に、まずはキャッシュが効果的に機能しているかを確認しましょう。キャッシュは、あらかじめ生成されたページを配信することで、訪問者のリクエストごとに PHP が実行されるのを防ぎます。適切に設定されていれば、商品ページやカテゴリページへのアクセスの大半は、そもそもサーバーに届くことすらありません。

オンラインストアでは一般的に、キャッシュ機能の活用がやや複雑になります。プラグインやテーマがno-cacheヘッダーを強制したり、買い物カゴや決済ページが不必要にキャッシュをバイパスしたり、CDNの設定に誤りがあったりすることがあります。これらの問題はそれぞれPHPのリソースを消費し、サイト速度に影響を与えます。

たとえば、小さなアパレルショップが夏のセールを行い、閲覧数が急に増えたとします。本来なら商品ページはキャッシュされるはずですが、テーマがno-cacheヘッダーを付けていたせいで、すべての訪問者のリクエストがPHPに到達してしまうなんてことも。

読み込み時間は3秒を超え、買い物客は次々と離脱していきます。この場合は、ヘッダーを修正し、CDN で「HIT」のレスポンスを確認すると、同じトラフィック量でもPHPへの負荷はほとんどなくなります。その結果、買い物カゴの操作や決済処理のためのリソースを十分に確保できます。

したがって、以下の点を確認してみてください。

  • 主要なキャッシュバイパスを確認し、不要なスキップを特定
  • シークレットウィンドウでテストし、新規訪問者の見え方をチェック
  • キャッシュヘッダーが正しく動作しているか確認し、オリジン応答ではなく「HIT」になっているかを確認

Kinstaのキャッシュ機能

Kinstaでは、複数のキャッシュレイヤーを自動処理しています。MyKinsta内では各キャッシュを微調整したり、クリアしたりすることが可能です。

サーバーレベルキャッシング

サーバーレベルのページキャッシュは、完全なHTMLページをサーバーに保存し、訪問のたびにPHPがページを再構築する負荷を解消します。すべてのサイトでデフォルトで有効になります。

MyKinstaにログイン後、「WordPressサイト」>(サイト名)>「キャッシュ」>「サーバーキャッシュ」に移動して、クリアすることができます。

サーバーキャッシュをクリア
サーバーキャッシュをクリア

エッジキャッシュ

エッジキャッシュは、Cloudflareのグローバルネットワークを利用して、同じ構築済みのページを各訪問者に最も近いデータセンターから配信します。MyKinstaで「WordPressサイト」>(サイト名)>「キャッシュ」>「エッジキャッシュ」に移動して、有効・無効にすることができます。

MyKinstaでエッジキャッシュを利用
MyKinstaでエッジキャッシュを利用

エッジキャッシュを利用することで、待ち時間が劇的に短縮され、オリジンサーバーからの負荷がさらに軽減されます。

CDNキャッシュ

KinstaのCDNは、画像、CSS、JavaScriptなどの静的ファイルをエッジでキャッシュします。

MyKinstaのCDNキャッシュ設定
MyKinstaのCDNキャッシュ設定

画像の最適化を設定したり、特定のファイルを除外したりすることも可能です。

キャッシュを手動でクリアする

すべてを一度にクリアするには(サーバー、エッジ、CDN)、「WordPressサイト」>(サイト名)>「キャッシュ」の「全てのキャッシュをクリア」をクリックするか、WP-CLIコマンド「wp kinsta cache purge –all」を使用します。

MyKinstaで全てのキャッシュを一括クリア
MyKinstaで全てのキャッシュを一括クリア

3. データベースの負担を減らす

PHPとキャッシュを最適化していても、データベースがパフォーマンスに悪影響を与えることがあります。商品フィルター、カテゴリページ、検索クエリごとに作業負荷がかかり、トラフィックの多い時期にはその負担は急速に増大します。

たとえば、数百の商品を扱う日用品ストアが、連休のプロモーションを実施しているとします。カテゴリページではすべての商品を一度に読み込み、さらにフィルターを使うたびに重いデータベースクエリが走ります。

トラフィックが増えるにつれてページはどんどん遅くなり、イライラした訪問者が次々と離脱。このような状況では、商品結果を適切にページネーションし、使われていないフィルターを取り除くだけで、データベースへの負荷を大幅に削減することが可能です。結果として、トラフィックのピーク時でも決済のリクエストがスムーズに処理されます。

データベースを軽量に保つ簡単な方法はいくつかあります。

  • Autoloadedオプションを整理:古いプラグイン設定や未使用のデータは、wp_optionsテーブルに蓄積され、クエリを遅くします。Kinstaでは、phpMyAdmin(MyKinstaでサイトを選択し、「情報」>「データベースへのアクセス」)で利用可能)またはSSHで接続し、SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC;のようなクエリを実行して、大きなautoloadedオプションを特定することができます。
  • 使用していない商品フィルターを除外:WooCommerceまたはフィルタープラグインの設定で、コンバージョンに影響しないフィルター(色、ブランド、サイズなど)を削除します。有効なフィルターはすべて、商品アーカイブページにクエリを追加します。MyKinstaのAPMツールを使って、買い物客がフィルターを使用した際に急増するクエリを特定し、コストに見合わないものを無効にしましょう。
  • 長いループはページネーションで分割:一度に何百もの商品や投稿を読み込むと、データベースに不必要な負担がかかります。テーマやカスタムテンプレートでは、posts_per_page(20や30など)の制限を設けたWP_Query、ページネーションや「詳しく見る」などのボタンを有効にしましょう。商品グリッドは軽量に保ち、ページが急増しても素早くレンダリングできるようにします。
  • transientsと検索プラグインを監査検索ツールの設定を誤ると、必要以上にデータベースに負荷がかかることがよくあります。transients(一時データ)もwp_optionsに保存され、放置すると膨れ上がります。WP-Optimizeのようなプラグインを使用するか、直接phpMyAdminでDELETE FROM wp_options WHERE option_name LIKE '%_transient_%';を実行すると解決できます。この方法は、『WordPressサイト高速化のヒント』でもご紹介しています。

監視ツールAPMなど)で同一のクエリが繰り返されたり、リクエストごとのデータベース時間が一貫して長かったりする場合は、Redisの使用を検討するといいかもしれません。基本的には、キャッシュとPHPが適切にチューニングされていれば、ほとんどのストアでは不要です。予測される収益がコストを上回る場合は、必要時にRedisを導入する価値がありそうです。

データベースのクリーンアップを行うことで、ストアのリソースを無駄にすることなく、売上につながるリクエストをスムーズに処理する能力を確保することができます。

監視ツールでのパフォーマンスチェックは必須

上記のような改善を行った後は、正しく機能しているかを確認することも欠かせません。MyKinsta(特に組み込みの分析機能)やAPMのようなツールを使えば、ボトルネックを簡単に特定可能です。PHPスレッドの滞留、キャッシュミス、遅いデータベースクエリなど、どこで問題が起きているのかがひと目でわかります。

MyKinstaでサイトのパフォーマンスを監視
MyKinstaでサイトのパフォーマンスを監視

キャンペーン実施前、実施中、そして実施後にこのような指標をチェックすることで、サイトのどこに負荷がかかっているかを正確に把握し、調整に効果があるかどうかを知ることができます。

まとめ

大規模なセールや急なトラフィック増加に対処するために、必ずしもサーバープランのアップグレードが必要になるわけではありません。適切に最適化を行えば、小規模なストアでも一時的なアクセス集中に対応可能です。

短期的なスパイクの吸収にPHPパフォーマンスアドオンの使用、キャッシュのフル活用、そしてデータベースの整理をすべて実行することで、大事な決済を高速かつ安定して処理することができます。

500エラーの防止や遅延の解消にもつながり、より多くのユーザーが注文を完了できるようになります。キャンペーンや期間限定のプロモーションを実施予定であれば、事前にPHPパフォーマンスアドオンを有効にし、効果的なキャッシュ設定と定期的なデータベースメンテナンスをセットで行うことをおすすめします。

Joel Olawanle Kinsta

Kinstaでテクニカルエディターとして働くフロントエンド開発者。オープンソースをこよなく愛する講師でもあり、JavaScriptとそのフレームワークを中心に200件以上の技術記事を執筆している。