yoshi2889 / tasks
支持多种任务类型的简单任务控制器。
Requires
- php: >=7.1.0
- react/event-loop: ^1.0
Requires (Dev)
- phpunit/phpunit: ^7
This package is auto-updated.
Last update: 2024-08-30 01:14:13 UTC
README
支持多种任务类型的简单任务控制器。
安装
您可以通过 composer
安装此类
composer require yoshi2889/tasks
用法
创建 TaskController
的实例,并向其中添加任何 TaskInterface
的实例
<?php $loop = React\EventLoop\Factory::create(); $taskController = new \Yoshi2889\Tasks\TaskController($loop); // A simple callback task, run only once, which will trigger in 10 seconds: $callbackTask = new \Yoshi2889\Tasks\CallbackTask(function () { echo 'Hello world!' . PHP_EOL; }, 10); // Output (after 10 seconds): Hello world!
可重复任务
RepeatableTask
实例是一个在其子任务上运行间隔的任务。在 RepeatableTask
开始运行子任务之前,它首先检查其过期时间是否已通过。如果没有,则不会运行任务。
例如,创建一个新的每 5 秒运行一次前一个 CallbackTask
的 RepeatableTask
$repeatableTask = new \Yoshi2889\Tasks\RepeatableTask($callbackTask, 5);
此任务将在之前在 CallableTask
中定义的 10 秒过后才开始运行。
取消任务
任务可以被提前取消。如何处理取消取决于任务类型。例如,如果我们取消一个 RepeatableTask
,它将内部取消其子任务并停止重复,然后将被丢弃
$repeatableTask->cancel();
然而,如果我们取消一个 CallbackTask
,它将仅处于无法由 TaskController
运行的状态,并在下一次运行时被丢弃。
TaskController
永远不应自己取消任务,这是用户的责任。
丢弃任务
默认情况下,在其 run() 方法中不返回新任务的 Task 将被丢弃。但是,如果一个 Task 返回了新任务,原始 Task 本身将被丢弃,而返回的任务实例将替换它。我们可以通过以下片段观察这一点
$callbackTask = new \Yoshi2889\Tasks\CallbackTask(function () { echo 'Hello '; return new \Yoshi2889\Tasks\CallbackTask(function () { echo 'world!' . PHP_EOL; }, 5); }, 5); // Output (after 10 seconds): Hello world!
丢弃的任务将被从 TaskController
中移除。
实现自定义任务
TaskController
接受实现 TaskInterface
接口的任何类。此接口包含以下方法
getExpiryTime(): int
:获取任务应该运行并之后丢弃的 UNIX 时间戳。请注意,默认情况下,TaskController
以 1 秒间隔运行,时间可能略有偏差。run(): ?TaskInterface
:运行实际任务。返回实现TaskInterface
的对象以插入新任务,或返回null
以丢弃当前任务。cancel(): void
:用于取消任务或将任务置于无法运行的状态。在调用此方法后,最好让getExpiryTime()
总是返回 0,以便任务将被丢弃。
许可证
此代码在 MIT 许可证下发布。请参阅 LICENSE
阅读它。