morjodrom / time-limiter
一个帮助跟踪执行PHP脚本剩余时间的类
2.0.0
2024-08-20 00:00 UTC
Requires
- php: >=7.0
Requires (Dev)
- php: >=8.1
- phpunit/phpunit: >=10
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