nikita2206 / poller
Poller库可用于轮询各种内容:套接字、其他进程、文件系统、任何东西!
Requires (Dev)
- phpunit/phpunit: 4.1.*
This package is not auto-updated.
Last update: 2024-09-24 02:19:59 UTC
README
Poller是一个用于轮询非阻塞内容的库。
先决条件
对于PHP来说,这不是一个很常见的任务,但有时你确实需要轮询一些东西直到它们给你回应。
例如,你可以运行后台的其他进程,并等待它们完成(你可以使用poller-symfony-process包来与Symfony的Process组件一起使用)或者你可以轮询套接字或流。
如何使用
假设你需要运行10个进程,但你只需要同时运行3个进程(只有3个工作槽)。为了实现这一点,你需要编写一个实现Poller\Task\Task
接口的实现,该接口将代表一个单独的进程,或者你可以使用已经实现的ProcessTask
来自poller-symfony-process包。
这样,你只需要实例化一个新的Poller\Task\TaskQueue
并将所有任务入队。
$tasksQueue = new TaskQueue(); $tasksQueue->enqueue(new ProcessTask(new Process("command to execute")));
现在你需要创建一个新的Poller实例,并传入你的队列对象以及你想要同时运行的任务数量(你有多少个工作槽)
$poller = new Poller($tasksQueue, 3);
现在你可以运行Poller了
$poller->run();
任务事件
你也可以使用Poller上的事件,我们有
Poller::EVENT_TASK_STARTED_PRE Poller::EVENT_TASK_STARTED_POST Poller::EVENT_TASK_FINISHED Poller::EVENT_TASK_TERMINATED_PRE Poller::EVENT_TASK_TERMINATED_POST
你可以使用attachListener
方法来附加你的监听器,例如。
$poller->attachListener(Poller::EVENT_TASK_STARTED_PRE, function ($eventName, NamedTask $task) { echo "Task ", $task->getName(), " is gonna be started!", "\n"; }); $poller->attachListener(Poller::EVENT_TASK_FINISHED, function ($eventName, NamedTask $task) { echo "Task ", $task->getName(), " was finished!", "\n"; });
任务队列
正如你所看到的,Poller需要TaskQueue来获取任务。但是Poller附带的TaskQueue类在某种程度上相当有限,它只是SplQueue的包装器,并且不太易于扩展。例如,如果你想创建一个无限运行的进程,使用TaskQueue的最佳方式可能是添加新任务在finish
事件中,但这不会很易读。
实际上,Poller接受任何实现了Poller\Task\PollerTaskQueue
接口的东西。因此,你可以轻松地实现无限队列
use Poller\Task\PollerTaskQueue; class InfiniteTaskQueue implements PollerTaskQueue { public function isEmpty() { return false; } public function dequeue() { return new YourOwnTask(); } }