ホームページ  >  記事  >  バックエンド開発  >  最大実行時間制限に対する基本的な保護

最大実行時間制限に対する基本的な保護

Susan Sarandon
Susan Sarandonオリジナル
2024-09-25 20:10:02520ブラウズ

Basic Protection Against Max Execution Time Limit

データのインポートまたはエクスポートを行ったことがある人なら、スクリプトの実行時間が短いという問題に遭遇したことがあるでしょう。最も簡単な解決策には、多くの場合、PHP 構成を調整するか、スクリプトの先頭で制限を完全に無効にすることが含まれます。ただし、実行時間を大幅に延長したり、完全に無効にしたりすると、セキュリティ リスクが生じます。停止できないバックグラウンド スクリプトは、過剰なリソースの消費につながる可能性があります。

繰り返しタスクを処理する場合、個々のパスを時間内に監視し、制限時間が経過する前に実行を正常に終了することを試みることができます。

// initialize basic variables for further work
$maxExecutionTime = (int)ini_get('max_execution_time');
$estimateCycleTime = 0;
$startTime = microtime(true);

// For demonstration purposes, we use an "infinite" loop with a simulated task lasting 10 seconds
while (true) {
   sleep(10);

   // Calculate the current runtime
   $currentRunTime = microtime(true) - $startTime;

   // Termination can be done either with a fixed constant
   // or by measuring the time of one pass and trying to use
   // the longest possible segment of the runtime
   // limit (has its problem).
   if ($estimateCycleTime === 0) {
       $estimateCycleTime = $currentRunTime;
   }

   // Check if the iteration stop time is approaching.
   // Subtract the time of one pass, which likely won't fit
   // within the window. 
   if (($maxExecutionTime - $estimateCycleTime) < $currentRunTime) {
       echo 'Time is end';
       break;
   }
}

1 つのパスの計算に基づく早期終了は、できるだけ少ない新しい実行で処理する必要があるパスが多数あり、1 つのパス内の各操作に同様に時間がかかる場合に適しています。個々のパスの所要時間が異なる場合は、パス時間に係数を加算する必要があります。もう 1 つのオプションは、事前定義された時間を使用することです:

$beforeEndTime = 1;

if (($maxExecutionTime - $beforeEndTime) < $currentRunTime) {
    echo 'Time is end';
    break;
}

API エンドポイントへの接続を閉じる、ファイルを閉じる、その他の操作を実行するなど、反復後にスクリプトが継続する場合は、この時間を忘れずに追加することが重要です。

以上が最大実行時間制限に対する基本的な保護の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。