morjodrom/time-limiter

一个帮助跟踪执行PHP脚本剩余时间的类

2.0.0 2024-08-20 00:00 UTC

This package is not auto-updated.

Last update: 2024-10-01 16:13:57 UTC


README

一个小的实用类,帮助限制脚本执行时间。

基本用法

该类通常用于循环中,循环中消耗时间较多。

// maximum time to execute one request
$REQUEST_TIMEOUT_SEC = 5; 

$curlClient = new SomeCurlClient(); // just an example.

// shared hosting often has a limit. E.g. 30 seconds
$maxExecutionTime = ini_get('max_execution_time'); 
$timeLimiter = new \timelimiter\TimeLimiter($maxExecutionTime, $REQUEST_TIMEOUT_SEC);

// check if there is time left to prevent 504 timeout
// recommended 
foreach($timeLimiter => $timeLeft){
  $result = $curlClient->doSomeHeavyJob([
      'timeout' => $REQUEST_TIMEOUT_SEC
  ]);
  // handle the result
  // ...
}

// or alternatively while loop might be used with respective Iterator calls.
while($timeLimiter->valid()){ 
  $result = $curlClient->doSomeHeavyJob([
      'timeout' => $REQUEST_TIMEOUT_SEC
  ]);
  $timeLimiter->next(); // must be called to adapt to long iterations
}

安装

使用 Composer 作为生产依赖项

composer require morjodrom/time-limiter

作为开发依赖项,仅用于开发场景

composer require --dev morjodrom/time-limiter

构造函数选项

int $limitSeconds - 处理的秒数。0 等于没有限制。从 ini_get('max_execution_time') 获取的值可能是期望的选项。

[int $preliminaryTimeout] = DEFAULT_TIME_UP_SECONDS = 3 在达到超时前停止执行的秒数。 $preliminaryTimeout 必须比你在循环中执行的最长 理论 操作长一点。因此,最后一个可能超过执行时间的危险操作被省略。该类跟踪每个迭代花费的时间,以更新 $preliminaryTimeout 以等于最长的操作

  • [int|null $startTimestamp = $_SERVER['REQUEST_TIME'] 默认使用。必须是自Unix纪元(1970年1月1日00:00:00 GMT)以来的时间戳,例如 time() 调用。

强烈建议使用 foreach 构造。使用正确的迭代器调用,也可以使用原始的 while 迭代。

方法

current(): int - 返回在超时前剩余的秒数 valid(): bool - 返回是否还有时间安全地执行脚本 next(): void - 必须在完成迭代后调用,以适应意外较长的迭代

支持

请随意提交一个问题: https://github.com/Morjodrom/time-limiter/issues

许可 - MIT