werkint/reactphp-event-loop

此包已被 废弃 并不再维护。作者建议使用 werkint/reactphp-event-loop 包。

事件循环抽象层,供库用于事件驱动的I/O。

v0.4.2 2016-03-08 02:09 UTC

README

Build Status Code Climate

事件循环抽象层,供库用于事件驱动的I/O。

为了使基于异步的库能够互操作,它们需要使用相同的事件循环。此组件提供了一个通用的 LoopInterface,任何库都可以针对它。这允许它们在同一个循环中使用,通过用户控制的单个 run 调用。

除了接口外,还提供了一些实现

  • StreamSelectLoop:这是唯一一个与PHP无缝工作的实现。它执行简单的 select 系统调用。它不是性能最好的循环,但仍然做得相当好。

  • LibEventLoop:它使用 libevent pecl 扩展。 libevent 本身支持多个系统特定的后端(epoll、kqueue)。

  • LibEvLoop:它使用 libev pecl 扩展(github)。它支持与libevent相同的后端。

  • ExtEventLoop:它使用 event pecl 扩展。它支持与libevent相同的后端。

所有循环都支持以下功能

  • 文件描述符轮询
  • 一次性定时器
  • 周期性定时器
  • 延迟执行回调

使用方法

以下是一个仅使用事件循环构建的异步HTTP服务器。

    $loop = React\EventLoop\Factory::create();

    $server = stream_socket_server('tcp://127.0.0.1:8080');
    stream_set_blocking($server, 0);
    $loop->addReadStream($server, function ($server) use ($loop) {
        $conn = stream_socket_accept($server);
        $data = "HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nHi\n";
        $loop->addWriteStream($conn, function ($conn) use (&$data, $loop) {
            $written = fwrite($conn, $data);
            if ($written === strlen($data)) {
                fclose($conn);
                $loop->removeStream($conn);
            } else {
                $data = substr($data, $written);
            }
        });
    });

    $loop->addPeriodicTimer(5, function () {
        $memory = memory_get_usage() / 1024;
        $formatted = number_format($memory, 3).'K';
        echo "Current memory usage: {$formatted}\n";
    });

    $loop->run();

注意: 工厂只是为了方便。它试图选择最佳可用实现。库 应当 允许用户注入循环的实例。它们 可以 在用户没有提供循环时使用工厂。