nikita2206/poller

该包最新版本(0.1.3)没有可用的许可信息。

Poller库可用于轮询各种内容:套接字、其他进程、文件系统、任何东西!

0.1.3 2014-09-23 12:27 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:19:59 UTC


README

Poller是一个用于轮询非阻塞内容的库。

Build Status

先决条件

对于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();
    }

}