PHPの実行制限は、リクエストの処理速度や、負荷がかかった状態でのウェブサーバーの信頼性に大きな影響を与えます。ここでは、その影響についてご説明します。 時間制限 メモリやCPUとの相互作用、WordPressやショップなどのサイトを安定かつ高速に保つ設定など、実際のブレーキ効果についてご説明します。.
中心点
- 実行時間 スクリプトの実行可能時間、タイムアウト、エラー率などを規定します。.
- メモリ制限 実行時間と実行時間は相互に作用し、ロード時間と安定性に影響を与えます。.
- ホスティングのチューニング (php.ini、PHP‑FPM) は、長いスクリプトやワーカーの過剰によるブロックを防止します。.
- WordPress/ショップ インポート、バックアップ、アップデート、およびcronジョブには、十分な制限が必要です。.
- モニタリング CPU、RAM、FPM のステータスからボトルネックや誤った制限を明らかにします。.
基本:実行時間が実際に測定するもの
指令 最大実行時間 PHP スクリプトが中断されるまでに、最大で何秒間アクティブに計算を行うかを指定します。タイマーは、PHP がスクリプトの実行を開始してから、ファイルアップロード時や Web サーバーがリクエストを受け付ける間ではなく、初めて起動します。 データベースへのクエリ、ループ、テンプレートのレンダリングは、この時間に完全にカウントされます。これは、CPU の性能が低い場合に特に顕著です。スクリプトが制限時間に達すると、PHP は実行を終了し、「Maximum execution time exceeded」などのエラーを返します。ログを見ると、ハングアップと思われる現象が、単に タイムアウト 不十分な指定によって引き起こされた。.
典型的なデフォルト値は 30 秒から 300 秒の間で、共有ホスティングでは通常、より厳しい制限が設けられています。これらの設定は、他のユーザーの動作を遅らせる無限ループやブロックプロセスからサーバーを保護します。しかし、厳しすぎる値は、トラフィックが多い場合に時間がかかる画像生成や XML 解析などの通常のタスクに影響を与えます。 上限値を高く設定すると、計算負荷の高いジョブは救われますが、複数の長いリクエストが同時に実行された場合、インスタンスに過負荷がかかる可能性があります。実際には、段階的にテストを行い、実行時間を メモリ, 、CPU、および並列性を評価します。.
実際の影響:パフォーマンス、エラー率、ユーザーエクスペリエンス
低すぎる 時間制限 ユーザーがページが壊れてるって感じるような、ハードな中断を発生させるんだ。WordPressのアップデート、画像の一括最適化、WooCommerceの大量エクスポートは、すぐに限界に達して、読み込み時間が長くなり、取引が危険になるんだ。 実行時間を 300 秒に延長し、同時に OPcache を導入すると、PHP の再コンパイルが減少するため、応答時間が大幅に短縮されます。制限が厳しい場合、スクリプトが 1 回で正常に実行されるのではなく、何度も再起動するため、CPU 負荷が高くなることも確認されています。経験上 パフォーマンス したがって、コードだけでなく、適切に設定された限界値にも直接依存します。.
値が高すぎることは自由通行券ではありません。なぜなら、長いランナーは PHP ワーカーを占有し、他のリクエストをブロックするからです。共有システムでは、これはすべての隣人にとってボトルネックにエスカレートします。VPS または専用サーバーでは、マシンがスワップに陥る可能性があります。 私は、必要最小限の高さで、可能な限り低く、常にキャッシュと組み合わせて使用するという経験則を順守しています。プロセスが定期的に非常に長くなる場合は、それをキューワーカーに移動するか、スケジュールされたタスクとして実行します。これにより、フロントエンドのリクエストは短く保たれ、作業負荷の高いジョブは 背景 走る。
実践:タイムアウトなしで WordPress およびショップスタックを運用する
多くのプラグインやページビルダーを備えた WordPress は、256~512 MB のメリットがあります。 メモリー そして、300 秒の実行時間、特にメディアのインポート、バックアップ、およびバックアップジョブの場合。OPcache がアクティブで、オブジェクトキャッシュが結果を保持している場合、テーマのコンパイル、REST コール、および Cron イベントはより適切に分散されます。 WooCommerce については、支払いおよび配送サービスに関する長い DB クエリと API リクエストも考慮しています。安定性の一部は、プラグインの適切な選択、つまり冗長性の低減、孤立したアドオンの排除によって実現されています。同時リクエストが多い場合は、以下を行う必要があります。 PHPワーカーの適切なサイズ設定, フロントエンドページが常に空き プロセス を受け取りました。
サイトマップ、フィード、ERP 同期を備えたショップシステムは、標準の制限を超えるピークを発生させます。 インポートルーチンはより長い実行時間を必要としますが、私はそれらを Web リクエストの外で実行されるジョブにカプセル化しています。分離できない場合は、トラフィックが少ない時間帯に時間枠を設定します。これにより、フロントエンドのトラフィックを軽減し、キャンペーンや販売イベントとの衝突を最小限に抑えます。明確な計画により、 エラー 顕著であり、コンバージョンフローを保護します。.
ホスティングのチューニング:php.ini、OPcache、および適切な制限値
保守的な値から始めて、意図的に値を上げていきます:max_execution_time = 300、memory_limit = 256M、OPcache 有効、アプリケーションレベルのオブジェクトキャッシュ。その後、負荷のピークを観察し、無作為に高い値を設定するのではなく、少しずつ調整していきます。 限界 Apache の場合、.htaccess が値を上書きできます。Nginx の場合、プール設定と PHP-FPM 設定がこれを実行します。変更後は、新しい設定が実際に有効になるよう、必ずリロードを行うことが重要です。自分の環境をよく理解している人は、同じハードウェアからより多くの成果を得ることができます。 パフォーマンス.
モニタリングでは、応答時間の 95 パーセンタイル、エラー率、およびプロセスごとの RAM 使用率に注意を払っています。ジョブが 120 秒を定期的に超える場合は、コードパス、クエリプラン、および外部サービスを確認します。明確な中断条件を備えたコンパクトなコードは、実行時間を大幅に短縮します。 さらに、リクエストが副次的な問題によって失敗しないように、アップロード制限、post_max_size、max_input_vars を調整することも有効です。適切な設定により、連鎖反応を防ぐことができます。 タイムアウト および再試行。.
PHP‑FPM:プロセス、並列性、および pm.max_children
同時実行可能な PHP プロセスの数は、並行して実行できるリクエストの数を決定します。ワーカーが少なすぎるとキューが発生し、多すぎると RAM を過剰に消費してシステムをスワップ状態に追い込みます。私は pm.max_children と memory_limit、およびプロセスあたりの平均使用量を比較検討し、実際のトラフィックでテストしています。スイートスポットは、ホストを スワップ より深く掘り下げたい方は、以下をご覧ください。 pm.max_children を最適化 具体的な管理手法 労働者.
純粋な数に加えて、pm.start_servers や pm.min_spare_servers などの起動パラメータも重要だよ。子プロセスが攻撃的に生成されると、コールドスタート時間と断片化が悪化してしまうんだ。 また、特に外部 API では、リクエストが占有される時間にも注目しています。タイムアウトの許容値が高すぎると、新しいリクエストのために確保すべきリソースが占有されてしまいます。結局、滞在時間が短いほど良いのです。 リクエスト 最大期間を超えて。.
インタラクション:実行時間、メモリ制限、ガベージコレクション
RAMが少ないと、頻繁にガベージコレクションが行われるため、計算時間がかかり、スクリプトの実行時間が短くなります。 タイムアウト メモリ制限を適度に上げると、GCサイクルの数が減って、実行時間が「長く」感じられるようになる。これは、パーサー、エクスポート、画像変換などのデータ負荷の高いプロセスに特に当てはまる。 アップロードについては、リクエストが入力制限で失敗しないように、upload_max_filesize、post_max_size、max_input_vars を調整しています。RAM の影響に関するより詳細な背景については、この概要にまとめています。 メモリ制限とRAM使用量, 、実用的な 関連性 照明付き。.
OPcache も乗数効果があります。コンパイル回数が減ると、リクエストごとの CPU 時間が短縮されます。オブジェクトキャッシュは、重い DB リードを削減し、応答時間を安定させます。これにより、制限をさらに引き上げる必要なく、わずかな時間枠を安定した処理に変えることができます。最後に、最適化されたインデックスとスリム化されたクエリにより、応答までの時間が短縮されます。アプリケーションで節約された 1 ミリ秒ごとに、負荷が軽減されます。 限界値 システムレベルで。.
測定とモニタリング:直感ではなくデータ
まず測定し、それから変更します。FPMステータス、アクセスログ、エラーログ、CPU、RAM、I/Oなどのメトリクスが明確さを提供します。特に役立つのは、外れ値を可視化し、最適化を客観化する95パーセンタイルと99パーセンタイルです。 調整を行うたびに、エラー率が低下し、応答時間が安定しているかどうかを確認します。繰り返し負荷テストを行い、新しい 設定 ピークトラフィック時にも機能します。数字がなければ、症状だけを分散させるだけで、真の問題は解決されません。 原因 解決する。.
アプリケーションのインサイトについては、高価なパスを明らかにするプロファイリングツールとクエリログが役立ちます。外部 API は、ローカルの問題と遅いパートナーサービスを区別するために、個別にログを記録しています。タイムアウトが主にサードパーティプロバイダで発生している場合は、そこで選択的に許容値を上げるか、サーキットブレーカーを設定します。 明確な分離により、エラー分析が迅速化され、最大の効果をもたらす部分に焦点を当て続けることができます。これにより、プラットフォーム全体が個々の問題に対して耐性を維持することができます。 弱点.
長期タスク:ジョブ、キュー、およびcron
エクスポート、バックアップ、移行、画像スタックなどのジョブは、フロントエンドリクエストではなく、バックグラウンドプロセスで実行する必要があります。私は、カスタマイズしたキューワーカーまたは CLI スクリプトを使用しています。 ランタイム フロントエンドを自由に保つために、別々の制限を設定しています。Cron ジョブは、ライブトラフィックと競合しないよう、トラフィックが少ない時間帯にスケジュールしています。フォールトトレランスについては、固定の繰り返しではなく、バックオフ機能を備えたリトライ戦略を採用しています。これにより、長いタスクもユーザーフローに影響を与えることなく、確実に実行されます。 邪魔する.
それでもジョブがウェブコンテキストで実行される場合、私はストリーミングによる応答と中間結果のキャッシュに頼ります。進捗状況の表示とバッチによる部分的な処理により、長時間のブロックを回避します。それでも逼迫した場合、ワーカーを一時的にスケールアップし、その後通常のレベルに戻します。この柔軟性により、コストを予測可能にし、リソースを節約することができます。 重要なのは、クリティカルパスを短く保ち、ユーザーパスから重い実行を排除することです。 移す.
高い制限における安全面およびフォールトトレランス
実行値が高いと、エラーのあるコードがリソースを拘束する時間が長くなる。私は、意味のある方法でこれを確保している。 中断 コード、入力の検証、外部呼び出しの制限で対応してるよ。API入力のレート制限は、ボットや悪用によるロングランのフラッディングを防ぐんだ。サーバー側では、暴走プロセスを止めるために、厳しいプロセスとメモリの制限を設定してるよ。多段階の保護コンセプトは、たとえ単一の リクエスト 脱線した。.
エラーページは、ユーザーが意味のある手順を確認できるよう、簡潔で情報豊富な内容にしています。ログは構造化して保存し、ディスク容量を節約するためにローテーションしています。アラートは、些細な問題ではなく、真の問題を示すしきい値に紐づけています。これにより、チームは真の問題に迅速に対応し、障害発生時にも対応能力を維持することができます。優れた可観測性により、対応までの時間を短縮します。 原因 劇的に。.
制限に関するよくある誤解
„「高いほど良い」というのは必ずしも正しくありません。スクリプトが長すぎるとプラットフォームがブロックされてしまうからです。 「すべては CPU の問題である」という見解は、RAM、IO、および外部サービスがペースを決定するため、不十分です。「OPcache で十分である」という見解は、DB のレイテンシとネットワークも同様に重要であることを認識していません。「コードのみを最適化すればよい」という見解は、構成とホスティングのセットアップも同様の効果を持つことを見落としています。私は、コードのリファクタリング、キャッシュ、および 構成, レバーに頼るのではなく。.
もう一つの考え方の誤り:「タイムアウトはサーバーの故障を意味する」。実際には、それはほとんどの場合、不適切な制限や不適切なパスを示しています。ログを読むと、パターンがわかり、適切な箇所を修正することができます。そうすることで、ハードウェアを交換することなく、エラー率を低下させることができます。明確な診断はコスト削減につながります。 予算 そして、目に見える結果を加速させます。.
構成例とベンチマーク:実際に役立つもの
私は典型的な負荷プロファイルを参照し、RAM 予算と並列性と照らし合わせて調整します。以下の表は、一般的な組み合わせをまとめたものであり、それらが応答時間と安定性にどのような影響を与えるかを示しています。値は出発点として、トラフィック、コードベース、外部サービスに合わせて調整する必要があります。ロールアウト後、私はメトリクスを確認し、小さなステップでさらに調整を続けています。これにより、システムは 計画的 負荷波動に敏感に反応しません。.
| 運営シナリオ | 実行時間 | メモリ制限 | 期待される効果 | リスク |
|---|---|---|---|---|
| 小さなWPページ、プラグインが少ない | 60~120秒 | 128~256 MB | 安定したアップデート、まれなタイムアウト | メディア関連職のピーク |
| ブログ/企業向けページビルダー | 180~300秒 | 256~512 MB | 応答時間が半分、中断が少なくなる | DBが良くない場合のロングランナー |
| WooCommerce/ショップ | 300 秒 | 512 MB | 安定したインポート、バックアップ、フィード | ワーカーあたりのRAM容量が大きい |
| API/ヘッドレスバックエンド | 30~120秒 | 256~512 MB | OPcacheによる非常に短いレイテンシ | 遅いパートナーとのタイムアウト |
同時リクエストが多い場合は、PHP‑FPM プールも調整し、定期的に監視する必要があります。RAM 容量を増やさずにワーカー数を増やすと、ボトルネックがさらに深刻になります。OPcache およびオブジェクトキャッシュを使用した節約的なプロセスにより、コアあたりのスループットが向上します。結局のところ、重要なのはバランスであり、個々の調整要素の最大値ではありません。まさにここで、構造化されたアプローチの効果が発揮されます。 チューニング より。
関連する制限:max_input_time、request_terminate_timeout、およびアップストリームタイムアウト
max_execution_time のほかに、いくつかの関連項目があります。 max_input_time PHP が入力(POST、アップロード)を解析する時間を制限します。この制限が低すぎると、実行時間とはまったく関係なく、大きなフォームやアップロードは実際のコードが開始される前に失敗します。FPM レベルで終了 リクエスト終了タイムアウト PHP がまだ実行制限に達していない場合でも、長時間実行されるリクエストは厳しいものになります。Web サーバーとプロキシは独自の制限を設定しています。Nginx (proxy_read_timeout/fastcgi_read_timeout)、Apache (Timeout/ProxyTimeout)、ロードバランサー/CDN は、定義された待機時間後に応答を中断します。実際には、次のことが当てはまります。 最小 効果的なタイムアウトが勝ちます。私は、診断を歪めるような目に見えない外部の障壁がないよう、この連鎖を一貫して維持しています。.
外部サービスは特に厄介です。PHP リクエストが API を待機している場合、実行時間だけでなく、HTTP クライアントの設定(接続/読み取りタイムアウト)も結果に影響します。 ここで明確な期限を設定しないと、ワーカーが不必要に長時間占有されてしまう。そのため、私は統合ごとに短い接続タイムアウトと応答タイムアウトを定義し、リトライポリシーとサーキットブレーカーで重要なパスを保護している。.
CLI 対 Web:バックグラウンドジョブに関するその他のルール
CLI プロセスは FPM とは動作が異なります。デフォルトでは、 最大実行時間 CLI では多くの場合 0(無制限)に設定されています。 メモリリミット ただし、引き続き適用されます。長時間のインポート、バックアップ、移行の場合は、CLI を意図的に選択し、パラメータを使用して制限を設定します。
php -d max_execution_time=0 -d memory_limit=512M bin/job.php
このようにして、フロントエンドリクエストから実行負荷を切り離しています。WordPress では、重い作業は WP-CLI を優先して実行し、Web-Cron には短くて再起動可能なタスクのみをトリガーさせるようにしています。.
コード自体が制御できるもの:set_time_limit、ini_set、および中断
アプリケーションは、サーバーの仕様範囲内で制限を解除することができます。 set_time_limit() そして ini_set(‚max_execution_time‘) リクエストごとに有効です。これは、機能が無効化されておらず、より低い FPM タイムアウトが適用されていない場合にのみ機能します。さらに、ループ内に明示的な中止条件を設定し、進捗を確認し、各段階を記録しています。. ignore_user_abort(true) クライアント接続が切断された場合でもジョブを完了することができます。これは、エクスポートやウェブフックに有用です。しかし、適切な停止処理を行わないと、このようなフリーパスは安定性を損なう危険性があるため、明確なガードが設定された例外的なケースに留める必要があります。.
キャパシティプランニング:pm.max_children を推測ではなく計算で算出
pm.max_children を盲目的に増やす代わりに、実際のメモリ使用量を計算します。そのためには、平均値を測定します。 RSS 負荷がかかった状態での FPM プロセスの使用状況(ps や smem などを参照)を確認し、カーネル/ページキャッシュ用に予備の余裕を見込んでください。簡単な目安としては、
PHP用に利用可能なRAM = 総RAM - データベース - Webサーバー - OSリザーブ pm.max_children ≈ floor(PHP用に利用可能なRAM / PHPプロセスあたりの平均RSS)
重要だ: メモリリミット RSS値じゃないよ。256Mの制限があるプロセスは、ワークフローによって80~220MBを実際に使うんだ。だから、ピーク時の実際の測定値で調整してるよ。キャッシュと拡張機能の負荷を減らすことで平均RSSが下がると、同じRAM予算でより多くのワーカーを収容できるんだ。制限を単純に上げるよりも、こっちのほうが効果的な場合が多いよ。.
外部依存性:タイムアウトを意識的に設定する
ほとんどの「保留中の」PHPリクエストは、IO(データベース、ファイルシステム、HTTP)を待機しています。データベースについては、明確なクエリ制限、インデックス戦略、トランザクションフレームワークを定義しています。HTTPクライアントについては、 短い接続および読み取りタイムアウト また、再試行は、指数関数的に遅延した数回の試行に制限します。コードでは、結果をキャッシュしたり、可能であれば並行処理したり、ジョブに外注したりすることで、外部呼び出しを分離しています。これにより、1 つの遅いパートナーによって FPM キュー全体がブロックされる可能性が低くなります。.
バッチ処理と再開可能性:長い実行を制御
長い手術は、明確に定義された バッチ (例:1回の実行につき200~1000レコード)チェックポイント付き。これにより、個々のリクエスト時間が短縮され、エラー後の再開が容易になり、進捗状況の可視性が向上します。実用的な構成要素:
- 進捗マーカー(最後のID/ページ)を永続的に保存する。.
- 重複実行を許容するための冪等操作。.
- 逆圧:95 パーセンタイルが上昇した場合、バッチサイズを動的に縮小します。.
- 管理タスクのライブフィードバックのためのストリーミング応答またはサーバー送信イベント。.
OPcache およびオブジェクトキャッシュと組み合わせることで、実行時間を全体的に増加させることなく、現実的な範囲内で安定した予測可能な実行時間を実現します。.
FPM‑スローログとエラー発生時の可視性
真の理解のために、私は FPM‑スローログ (request_slowlog_timeout、slowlog‑パス)。リクエストがしきい値より長くアクティブなままの場合、バックトレースがログに記録されます。これは、原因不明のハングアップが発生した場合に非常に有用です。 同時に、FPM ステータス (pm.status_path) は、アクティブ/アイドルプロセス、キュー、リクエストの所要時間に関するライブデータを提供します。私は、このデータをアクセスログ (アップストリーム時間、ステータスコード) および DB スローログと照合して、最も狭い箇所を正確に特定しています。.
コンテナと VM:Cgroups と OOM を監視
コンテナでは、オーケストレーションは php.ini とは独立して CPU と RAM を制限します。プロセスが メモリリミット, 、カーネルは「適切な」PHP設定にもかかわらず、OOMキラーによってコンテナを終了させることがあります。そのため、私はCgroupの制限値より下に追加の予備を確保し、memory_limitだけでなくRSSも監視し、OPcacheのサイズを控えめに調整しています。 CPU に制限のある環境では、実行時間が長くなり、同じ実行時間では不十分な場合が多くなります。このような場合、一律にタイムアウトを長くするよりも、プロファイリングと意図的な並列性の低減の方が効果的です。.
PHPバージョン、JIT、拡張機能:小さな調整で大きな効果
新しい PHP バージョンでは、エンジンが大幅に最適化されています。 ジャストインタイム 典型的な Web ワークロードの速度を劇的に向上させることはめったにありませんが、OPcache はほとんどの場合、劇的な速度向上をもたらします。私は拡張機能をスリムに保っています。追加のライブラリは、メモリフットプリントとコールドスタートコストを増加させるからです。realpath_cache_size および OPcache パラメータ(メモリ、再検証戦略)は、コードベースに合わせて調整しています。これらの詳細設定により、リクエストあたりの CPU 使用率が短縮され、時間制限が一定の場合、直接的にヘッドルームが拡大します。.
エラーパターンを認識する:簡単なチェックリスト
- 負荷がかかっているときに504/502が頻繁に発生:ワーカーが少なすぎる、外部サービスが遅い、プロキシタイムアウトがPHPの制限より短い。.
- „エラーログに「最大実行時間を超えました」と表示される場合:コードパス/クエリのコストが高い、またはタイムアウトが厳しすぎる – プロファイリングとバッチ処理。.
- RAMが急上昇、スワップが増加:pm.max_childrenが高すぎるか、Ø‑RSSが過小評価されている。.
- アップロード/フォームでの定期的なタイムアウト:max_input_time/post_max_size/クライアントタイムアウトを調和させる。.
- バックエンドが遅く、フロントエンドは正常:管理エリアにおけるオブジェクトキャッシュ/OPcacheが小さすぎるか、無効になっている。.
簡単にまとめると
PHPの実行制限は、リクエストの実行速度と、ピーク時のページの信頼性を決定します。私は実行時間と メモリー 決して単独ではなく、CPU、FPMワーカー、キャッシュに合わせて調整します。WordPress やショップの場合、300 秒と 256~512 MB が実行可能なスタートとして機能し、OPcache とオブジェクトキャッシュが追加されます。その後、95 パーセンタイル、エラー率、RAM 使用率に基づいて調整し、ボトルネックがなくなるまで調整します。この方法により、 タイムアウト, 、サイトは反応が良く、ホスティングは予測可能であり続けます。.


