danog / loop
AMPHP 的循环抽象
1.1.1
2023-09-30 12:45 UTC
Requires
- php: >=8.1
- amphp/amp: ^3
Requires (Dev)
- amphp/php-cs-fixer-config: ^2
- amphp/phpunit-util: ^3
- phpunit/phpunit: ^9
- psalm/phar: dev-master
README
danog/loop
提供了一套强大的基于 amphp 的异步循环 API,用于定期或在需要时执行操作,类似于线程的后台循环。
安装
composer require danog/loop
API
- 基础
- 高级
Loop
一个可以在后台(异步)运行 loop
函数中包含的代码的循环。
实现暂停和恢复功能,并且可以从外部或内部停止。
API
namespace danog\Loop; abstract class Loop { /** * Stop the loop. */ public const STOP; /** * Pause the loop. */ public const PAUSE; /** * Rerun the loop. */ public const CONTINUE; /** * Loop body. * * The return value can be: * A number - the loop will be paused for the specified number of seconds * Loop::STOP - The loop will stop * Loop::PAUSE - The loop will pause forever (or until loop is `resume()`'d * from outside the loop) * Loop::CONTINUE - Return this if you want to rerun the loop immediately * * The loop can be stopped from the outside by using stop(). * @return float|Loop::STOP|Loop::PAUSE|Loop::CONTINUE */ abstract protected function loop(): ?float; /** * Loop name, useful for logging. */ abstract public function __toString(): string; /** * Start the loop. * * Returns false if the loop is already running. */ public function start(): bool; /** * Resume the loop. * * If resume is called multiple times, and the event loop hasn't resumed the loop yet, * the loop will be resumed only once, not N times for every call. * * @param bool $postpone If true, multiple resumes will postpone the resuming to the end of the callback queue instead of leaving its position unchanged. * * @return bool Returns false if the loop is not paused. */ public function resume(bool $postpone = false): bool; /** * Stops loop. * * Returns false if the loop is not running. */ public function stop(): bool; /** * Check whether loop is running. */ public function isRunning(): bool; /** * Check whether loop is paused. */ public function isPaused(): bool; /** * Report pause, can be overriden for logging. * * @param float $timeout Pause duration, 0 = forever */ protected function reportPause(float $timeout): void; /** * Signal that loop was started. */ protected function startedLoop(): void; /** * Signal that loop has exited. */ protected function exitedLoop(): void; }
GenericLoop
如果你想要一个更简单的方式来使用 Loop
,你可以使用 GenericLoop。
namespace danog\Loop; class GenericLoop extends Loop { /** * Constructor. * * The return value of the callable can be: * * A number - the loop will be paused for the specified number of seconds * * GenericLoop::STOP - The loop will stop * * GenericLoop::PAUSE - The loop will pause forever (or until loop is `resume()`'d * from outside the loop) * * GenericLoop::CONTINUE - Return this if you want to rerun the loop immediately * * If the callable does not return anything, * the loop will behave is if GenericLoop::PAUSE was returned. * * The loop can be stopped from the outside by using stop(). * * @param callable(static):?float $callable Callable to run * @param string $name Loop name */ public function __construct(callable $callable, private string $name); /** * Get loop name, provided to constructor. */ public function __toString(): string; }
PeriodicLoop
如果你只想每 N 秒执行一次操作,PeriodicLoop 是最佳选择。
namespace danog\Loop; class PeriodicLoop extends GenericLoop { /** * Constructor. * * Runs a callback at a periodic interval. * * The loop can be stopped from the outside by calling stop() * and from the inside by returning `true`. * * @param callable(static):bool $callback Callable to run * @param string $name Loop name * @param ?float $interval Loop interval; if null, pauses indefinitely or until `resume()` is called. */ public function __construct(callable $callback, string $name, ?float $interval) /** * Get name of the loop, passed to the constructor. * * @return string */ public function __toString(): string; }