承接 nikita2206/poller 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

nikita2206/poller

Composer 安装命令:

composer require nikita2206/poller

包简介

Poller library can be used for polling stuff: Sockets, other processes, file system, anything!

README 文档

README

Poller is a library designed for polling non-blocking stuff.

Build Status

Prerequisites

It's not a very common task for PHP but sometimes you really need to poll some things until they answer you something.

For example you can run other processes in the background and wait until they finish (you can use poller-symfony-process package for it to work with Symfony's Process component) or you can poll sockets or streams.

How to use

Suppose you have 10 processes that you need to run and you need to have only 3 processes running at the same time (only 3 job slots). To implement this you will need to write an implementation of Poller\Task\Task interface which will represent a single process or you can use already implemented ProcessTask from poller-symfony-process package.

This way you will just need to instantiate a new Poller\Task\TaskQueue and enqueue all your tasks in it.

$tasksQueue = new TaskQueue();
$tasksQueue->enqueue(new ProcessTask(new Process("command to execute")));

Now you need to create a new Poller instance and pass it your queue object and how many tasks do you want to run simultaneously (how many job slots do you have):

$poller = new Poller($tasksQueue, 3);

And now you're ready to run the Poller:

$poller->run();

Task events

You can also use events on Poller, we have:

Poller::EVENT_TASK_STARTED_PRE
Poller::EVENT_TASK_STARTED_POST
Poller::EVENT_TASK_FINISHED
Poller::EVENT_TASK_TERMINATED_PRE
Poller::EVENT_TASK_TERMINATED_POST

You can attach your listeners using attachListener method, f.e.:

$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";
});

Tasks queue

As you already saw, Poller needs TaskQueue to get tasks from. But TaskQueue class that comes with Poller is pretty limited in a way that it's just a wrapper of SplQueue and it's not very extendable. What if, for example, you want to create a process that runs some tasks forever? The best case using TaskQueue could be adding new tasks on finish event, but it wouldn't be very readable.

Actually Poller accepts anything that implements Poller\Task\PollerTaskQueue interface. So you can easily implement infinite queue:

use Poller\Task\PollerTaskQueue;

class InfiniteTaskQueue implements PollerTaskQueue
{

    public function isEmpty()
    {
        return false;
    }

    public function dequeue()
    {
        return new YourOwnTask();
    }

}

统计信息

  • 总下载量: 1.44k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 9
  • 点击次数: 2
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 9
  • Watchers: 2
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: Unknown
  • 更新时间: 2014-07-23

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固