多くのウェブサイトは、以下の点で失敗しています。 ピーエッチピーエス エラーは表示されないものの、メモリ制限が発生しています。この目に見えないクラッシュがどのように発生し、何が引き金となり、どのように対処すべきかを説明します。 チューニング メモリエラーを確実に停止する。.
中心点
- サイレントエラー ページをブロックし、目に見えるメッセージは表示されません。.
- 限界 64~128Mでは、多くの場合、もはや不十分です。.
- プラグイン また、大規模なデータベースはRAMの消費量を増加させます。.
- ホスティングチューニング FPMとOPcacheを使用することでリスクを軽減します。.
- モニタリング ボトルネックを早期に発見します。.
メモリ枯渇とは何ですか?
スクリプトが割り当てられたメモリを超過すると、多くの場合、目に見える エラー. その代わりに、プロセスは突然動作を停止し、白い画面や、 タイムアウト 効果があります。共有サーバーでは、プロセスを早期に終了させる追加の保護メカニズムが作動します。これにより、プラットフォームは過負荷を防止しますが、ユーザーにとっては、原因不明のフリーズのように見えます。ログには、欠落、中断されたリクエスト、FPMの再起動などが記録されますが、実際の原因は RAM の制限にあります。.
重要なのは、504 エラーや 502 エラーは、従来のタイムアウトのように見えるけど、多くの場合、プロセスが途中で中断された結果だってこと。 メモリリミット リクエストごとに適用されます。事前に RAM を予約することはなく、制限を超えた場合にハードに終了します。サーバー自体がスワップ状態になると、形式的には制限に達していないように見えても、応答時間が大幅に長くなります。実際には、ユーザーにはフリーズや空白のページが表示されるという同じ影響が生じます。.
メッセージのないサイレントエラーを検出
サイレントエラーは、生産システムがエラーメッセージを抑制したり、 ピーエッチピーエフピーエム ボトルネックが発生した場合、ワーカーを再起動します。限界に近づくと、ガベージコレクションが頻繁に起動し、 レイテンシー, 明確なメッセージを出力せずに。プレッシャーがかかると、OOMキラーはPHPが出力を書き込む前にプロセスを終了させます。実際には、502/503ゲートウェイエラー、散発的なホワイトスクリーン、散発的な空のログが見られます。制限がレスポンス時間をどのように左右するかを理解したい方は、コンパクトな PHPメモリ制限のパフォーマンスへの影響; そうすることで、症状をよりよく分類することができます。.
FPM スローログと FPM ステータスも追加でチェックします。ステータスには、稼働中/アイドル状態のワーカー、平均実行時間、現在のキューの長さが表示されます。 エラーログに「terminated」や「out of memory」が頻繁に記録されている場合や、スローログのエントリがピークと並行して増加している場合は、信頼できる指標となります。また、Nginx または Apache のエラーログでは、FPM の再起動やプールオーバーフローと一致する 502/504 エラーのパターンを確認できます。.
日常生活における典型的な原因
リソースを大量に消費するプラグインは、大きな 配列 オブジェクトをメモリに保存します。複数のオブジェクトが並行して動作すると、消費量が急激に増加します。画像オプティマイザー、クローラー、SEOスキャナー、ページビルダーは、大量のデータを取得し、データをより長く保持します。 RAM 必要以上に。長年にわたって蓄積されたリビジョン、トランジェント、スパムコメントのデータベースは、クエリがプロセスにより多くの結果を引き込むため、この問題をさらに悪化させます。フィルター検索を行うショップなど、負荷が高い場合、複数の PHP ワーカーが限られたメモリを争います。さらに、多くの拡張機能が有効になっていると、基本消費量が増加するため、実際のクエリのためのヘッドルームがほとんど残されません。.
特に重要なのは、画像およびPDFの処理(Imagick/GD)、インポーター、バックアッププラグイン、全文検索、および大きなJSONペイロードを処理するRESTエンドポイントです。Cronジョブ(インデックスの再構築、フィード、同期など)は、訪問者と並行して実行されることが多く、予期せぬピークを引き起こします。 管理者エリアでは、エディタプレビュー、メタボックス、ライブ検証が積み重なって、バックエンドが頻繁に WP_MAX_MEMORY_LIMIT フロントエンドとして衝突する。.
制限と実際の消費量をチェックする
効果的な メモリリミット およびアクティブなモジュールを確認します。WordPress では、デバッグモードを使用してリクエストごとのピークメモリを記録し、特に多くのメモリを消費している呼び出しを特定します。簡単なテストのために、テストページを設定し、プラグインをブロック単位で無効にして、その動作を観察します。 ピーク 同一のページアクセスで。ホスティングパネルや ps/top/wpm を使って、各 FPM ワーカーの平均使用量を調べます。そうすることで、ボトルネックを測定可能にし、次の制限について十分な根拠に基づいて判断することができます。.
// WordPress での簡易テスト (wp-config.php) define('WP_DEBUG', true); define('SCRIPT_DEBUG', true); // クエリモニターやログ出力を通じてピークメモリを確認する
再現性のある測定を行うため、PHP から直接ピーク値を記録しています。これにより、本番環境に近いテストでも、個々のコントローラ、フック、ショートコードの消費量を把握することができます。
// MUプラグインファイルまたはfunctions.php内で:add_action('shutdown', function () { if (function_exists('memory_get_peak_usage')) {
error_log('ピークメモリ: ' . round(memory_get_peak_usage(true) / 1024 / 1024, 1) . ' MB | URI: ' . ($_SERVER['REQUEST_URI'] ?? 'CLI')); } });
重要:CLI と FPM は、多くの場合、異なる php.ini ファイルを使用します。WP-CLI では問題なく動作するスクリプトが、Web コンテキストでは失敗する場合があります。そのため、私は両方のコンテキストを明示的にチェックしています (php -i 対 php-fpm)そして必要に応じて php -d memory_limit=512M script.php 仕事の限界。.
PHPのメモリ制限を適切に増やす
私は段階的に制限を引き上げ、各ステップの後にテストを行います。 安定性. まず、256M に増やすだけで十分な場合が多いですが、データ集約型のワークロードの場合は 512M に増やし、その動作を観察します。 ピーク. 重要:制限値を引き上げても、非効率的なクエリが引き続き作業を生み出すため、根本的な問題は解決されません。また、FPM ワーカーは、制限値とプロセス数に比例して、すぐに総 RAM を上回ってしまうことに注意してください。そのため、私は制限値の引き上げと、プラグイン、データベース、FPM パラメータの最適化を組み合わせています。.
// 1) wp-config.php (「これで編集は終了です!」の前に) define("WP_MEMORY_LIMIT", '256M');
# 2) .htaccess (「# END WordPress」の前) php_value memory_limit 256M
; 3) php.ini memory_limit = 256M ; 必要に応じて 512M を試す
// 4) functions.php (必要に応じてフォールバック) ini_set('memory_limit', '256M');
管理タスクについては、フロントエンドを不必要に肥大化させることなく、追加で上限値を高く設定しています。
// wp-config.php define('WP_MAX_MEMORY_LIMIT', '512M'); // /wp-admin および特定のタスクのみ
典型的な落とし穴:PHP-FPM を使用する場合 php_value- .htaccess のディレクティブは使用しません。ここでは、 .user.ini または FPM プール設定。さらに、一部のホスティング事業者は顧客側の設定を上書きします。私は常に実行時に有効な制限を確認しています (ini_get('memory_limit')). memory_limit = -1 生産ではタブーです。リークやスパイクを制限できなくなり、サーバーをダウンさせてしまうからです。.
ホスティングのチューニング:OPcache、FPM、および拡張機能
持続可能な修正策は、上限引き上げと的を絞った対策を組み合わせたものです。 チューニング. OPcache は、頻繁に使用するスクリプトがキャッシュに残り、再コンパイルの頻度を減らすことができるよう、十分な大きさに設定しています。 PHP-FPM では、pm.max_children、pm.max_requests、pm.memory_limit を適切に設定して、リクエストが不足することなく、サーバーの余裕を確保しています。不要な PHP 拡張機能は、各ワーカーの基本メモリを圧迫するため、削除しています。これにより、ヘッドルームを確保し、レイテンシを低減し、サイレントクラッシュのリスクを大幅に軽減しています。.
OPcache には、コードベースに応じて調整する、実績のある堅実なデフォルト設定があります。
; opcache の推奨設定 opcache.enable=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=20000 opcache.validate_timestamps=1 opcache.revalidate_freq=2
FPM は実際の測定値に基づいてサイズを決定します。大まかな目安としては、 (総 RAM − OS/サービス − DB − OPcache) / 平均ワーカー消費量 = pm.max_children. 例:8 GB RAM、1.5 GB OS/デーモン、2 GB DB、256 MB OPcache、180 MB/ワーカー → (8192−1536−2048−256)/180 ≈ 24、したがって 20~22 で開始し、キューとスワップを監視します。. pm.max_requests 私は、再起動の頻度を抑えながらリークをカットするために、適度な値(例えば 500~1000)を設定しています。 ダイナミック そして オンデマンド トラフィックプロファイルに応じて選択します。オンデマンドは、散発的な負荷ピーク時に RAM を節約し、ダイナミックは、持続的な負荷に対してより迅速に対応します。.
| ホスティング・タイプ | 典型的なメモリ制限 | チューニング機能 | 用途 |
|---|---|---|---|
| 共有基本 | 64~128M | 選択肢が少ない | 小さな ブログ |
| マネージド・ワードプレス | 256~512M | OPcache、FPMプロファイル | 成長する サイト |
| ブイピーエス | 512M~無制限 | フルコントロール | ショップ、, ポータル |
| webhoster.de(テスト勝者) | 768M+まで | OPcache および FPM の最適化 | パフォーマンスフォーカス |
データベースとプラグインをスリムに保つ
私は定期的にデータベースを整理し、古いものを削除しています。 改訂, 、期限切れのトランジェントを削除し、スパムコメントをクリーンアップします。 クリーンなインデックスはクエリを高速化し、リクエストあたりのメモリ要件を大幅に削減します。プラグインについては、その有用性とコストを比較検討し、重いプラグインはより軽量な代替品に置き換えます。キャッシュプラグインとクリーンなページキャッシュは、動的な呼び出しを減らし、負荷時の RAM を節約します。この規律あるアプローチにより、ピーク時の消費が大幅に制限され、制限が確実に守られるようになります。.
また、クエリの結果が制限され、必要なフィールドのみが読み込まれるようにしています。WordPress では、たとえば 'fields' => 'ids' 大規模なリストビューのストレージ要件を大幅に削減します。永続的なオブジェクトキャッシュはデータベースの負荷を軽減し、リクエストの実行時間を短縮します。ただし、プロセス内に不必要に多くのデータが残留しないように、内部リクエストキャッシュをオーバーフローさせないことが重要です。.
メモリの断片化について理解する
十分なRAMがあるように見えても、断片化によって空き容量が減少する場合があります。 ブロック 大きな配列が収容できなくなるほど、多くの小さな断片に分割します。そのため、特に画像、JSON、検索機能において、割り当てと解放のパターンを観察しています。データのライフサイクルが明確な短いリクエストは、断片化を軽減します。また、OPcache と最適化されたオートロード戦略も、メモリのチャーンを削減します。より深く掘り下げたい方は、その背景について メモリの断片化 および実際のワークロードへの影響。.
ガベージコレクション:難点と調整方法
PHPのガベージコレクションはメモリを節約しますが、限界域では スパイク トリガーする。サイクルを含む高いオブジェクトグラフは、エンジンに頻繁な GC 実行を強制し、リクエストを長引かせます。私は、大きな構造を縮小し、フルロードの代わりにストリームを使用し、めったに使用されないデータを中間ステップに保存しています。エッジケースでは、短いタスクのために GC を一時停止し、制御して再度有効にする価値があります。実践的な紹介は、以下の記事をご覧ください。 ガベージコレクションの最適化, 具体的な調整方法について説明しています。.
ピーク消費に対するコーディング戦略
多くのストレージの問題は、コードで解決しています。大量のデータを配列にロードする代わりに、ジェネレータ、ページネーション、ストリームを使用しています。広範な集約構造は避け、中間結果を早期に解放できる関数を記述しています。.
- ページネーション:大きなリストをページに分割し、必要なフィールドのみを読み込む。.
- ストリーム/ジェネレータ:ファイルと結果を一つずつ処理します。.
- チャンキング:フルロードではなく、ブロック単位でのインポート/エクスポート。.
- フォーマットの選択:巨大な配列ではなく JSON ストリームを使用し、可能な場合は反復的に解析する。.
- 意識的なライフサイクル:変数を早期に設定し、参照を避ける。.
// 例:ファイルをフルロードではなくストリーミングする function stream_copy($src, $dst) { $in = fopen($src, 'rb'); $out = fopen($dst, 'wb');
while (!feof($in)) { fwrite($out, fread($in, 8192)); } fclose($in); fclose($out); }
// 例:大きな配列をブロックで処理 foreach (array_chunk($bigArray, 500, true) as $chunk) { process($chunk); unset($chunk); }
// WordPress: メモリ使用量の少ないクエリ
$q = new WP_Query([ 'post_type' => 'product', 'posts_per_page' => 200, 'fields' => 'ids', 'no_found_rows' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, ]);
画像処理については、エディタを慎重に選択しています。リソースの限られたシステムでは、問題が発生した場合にエディタの変更を検討します。
// Imagick を一時的に回避する(ピーク時など) add_filter('wp_image_editors', function() { return ['WP_Image_Editor_GD', 'WP_Image_Editor_Imagick']; });
ノイズのないモニタリングとロギング
私は、意味のあるロギングを有効にします。 国境 システムに負荷をかけずに、エラー、ピーク、遅いリクエストを把握します。クエリモニターと FPM ステータスページでは、エンドポイントごとの RAM、実行時間、ボトルネックを確認できます。ログでは、同時発生の 502 エラー、FPM の再起動、突然の停止などのパターンを探します。 変更のたびに小さな負荷テストを行うことで、適切な調整を行ったかどうかをすぐに確認できます。これにより、実際の訪問者に影響が出る前に、サイレントダウンを阻止することができます。.
実際には、「基本セット」が有効であることが証明されています。FPM スローログを有効にし、エラーログをローテーションし、ログのフラッドを防ぐためにレート制限を設定します。 モニタリングでは、CPU、RAM、スワップ、FPM キューの長さ、および応答時間を相関させています。スワップが増加したり、FPM キューが記録されたりすると、並行して同時実行数(ワーカーの数を減らす)を減らすか、最もコストのかかるエンドポイントを最初に最適化します。.
特殊ケース:管理者、CLI、コンテナ
管理者エリアでは、当然ながら制限はより高くなっています。ここでは、多くのデータを処理し、プレビュー画像を生成し、リストをエクスポートします。 WP_MAX_MEMORY_LIMIT この追加分を管理者に限定します。CLI ジョブについては、タスクごとに制限を定義します(例:. php -d memory_limit=768M)を使用して、フロントエンドに負荷をかけることなく、重いエクスポートを確実に実行します。コンテナ(cgroups)では、カーネルが RAM のハードリミットを設定していることに注意してください。PHP は確かにその メモリリミット, 、コンテナの制限を超えた場合は、OOMキラーによって終了されます。そのため、コンテナの制限、FPMワーカー数、および メモリリミット 一緒に。.
落とし穴を意図的に回避する
- .FPM では、.htaccess ディレクティブは多くの場合機能しません。
.user.iniまたはプール構成を利用してください。. - CLI と FPM で異なる Ini ファイルを使用すると、テスト結果に一貫性がなくなります。必ず両方を確認してください。.
メモリリミットFPMを再起動せずに増やすと効果がない – サービスをきちんと再読み込みする。.- 上限が高すぎるとスワップ負荷が発生します。より効率的なクエリと、より少ないワーカーを使用することをお勧めします。.
pm.max_requests無限に設定しないでください。そうしないと、リークがプロセスに永遠に残ってしまいます。.- アップロード/エクスポート:POST/アップロード制限(post_max_size、upload_max_filesize)をRAM容量に合わせて適切に調整してください。.
簡単にまとめると:故障を防ぐ方法
まず、制限とピーク消費量をチェックし、それを持ち上げます。 メモリリミット 適度に調整して、もう一度測定する。それと同時に、プラグインをスリム化し、データベースを最適化し、不要な拡張機能を削除する。それから、OPcache と PHP-FPM を調整して、サーバーが十分な バッファ ピーク時の負荷に対応しています。正確なロギングと短い負荷テストにより、リスクを最小限に抑え、静的なエラーをより迅速に検出しています。これにより、サイトの安定性が維持され、検索エンジンはより優れた読み込み時間を評価し、訪問者はサイトに留まることになります。.


