Skip to content

A small utilities library to provide loop scheduling

License

Notifications You must be signed in to change notification settings

Morjodrom/time-limiter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Time Limiter

A small utility class to help to limit script execution time.

Basic usage

The class is usually used within loops with heavy time consumption.

// 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
}

Installation

As a production dependency using Composer:

composer require morjodrom/time-limiter

As a dev-dependency for deveopment-only cases:

composer require --dev morjodrom/time-limiter

Constructor options

int $limitSeconds - seconds to process. 0 equals to no limit. Value from ini_get('max_execution_time') might be the desired option.

[int $preliminaryTimeout] = DEFAULT_TIME_UP_SECONDS = 3 seconds to stop execution preliminary before reaching the timeout. $preliminaryTimeout must be a bit greater that the longest theoretical operation you perform in a loop. Therefore, the last risky operation that might exceed the execution time is omitted. The class tracks the time spend on each iteration to update $preliminaryTimeout to equal the longest operation

  • [int|null $startTimestamp = $_SERVER['REQUEST_TIME'] is used by default. Must be a timestamp since Unix Epoch (January 1 1970 00:00:00 GMT), e.g. time() call.

It is highly encouraged to use foreach construction. Raw while iteration also is possible with correct Iterator calls

Methods

current(): int - returns number of seconds left before the timeout valid(): bool - returns if there is time left to perform the script safely next(): void - must be called after a finished iteration to adapt to unexpected long iterations

Support

Feel free to open an issue: https://github.com/Morjodrom/time-limiter/issues

License - MIT

About

A small utilities library to provide loop scheduling

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages