cismonx/workerman-amp

There is no license information available for the latest version (v0.1) of this package.

Amp event loop for Workerman.

v0.1 2017-08-18 15:26 UTC

README

概述

Amp是一个事件驱动的PHP框架,与ReactPHP类似。

本项目用于将Amp的event-loop应用于Workerman,从而可以在Workerman中使用基于Amp的高性能组件,例如异步MySQL,异步Redis,异步HTTP客户端等。

笔者修改了本项目的源码,使其兼容原生Amp。现在无需修改Amp的源码就可以在项目中使用其所有组件。以后笔者可能会发布一些Demo。

使用说明

  1. 使用composer将Workerman\Events\Amp加载到项目中。
composer require cismonx/workerman-amp
  1. 将Amp设置为Workerman所使用的event-loop。如下:
Worker::$eventLoopClass = '\\Workerman\\Events\\Amp';

兼容Amp协程

在Amp中,协程是一个十分重要的特性。对Workerman的源码稍加修改,将watcher回调中的同步调用(call_user_func)改为异步调用(yield \Amp\call()),即可在Workerman的事件回调函数中直接使用Amp协程。

以下几点需要注意:

  1. 以上提到的对Workerman源码的修改在src目录下的coroutine-compatibility.patch中。这个补丁对Workerman-3.4.5-stable有效。

  2. 目前只能在onConnectonSslHandshakeonMessage这三个事件回调函数中使用Amp协程。

以下是使用Amp协程的示例(测试的时候同时多发几条请求,可以看出效果)

use Workerman\Worker;
Worker::$eventLoopClass = '\\Workerman\\Events\\Amp';
$worker = new Worker('http://[::]:20080');
function subtractToZero($init, $interval) {
    $value = $init;
    $emitter = new Amp\Emitter;
    $id = \Workerman\Lib\Timer::add($interval, function () use ($emitter, &$value, &$id) {
        if ($value > 0)
            $emitter->emit(--$value);
        else {
            $emitter->complete();
            \Workerman\Lib\Timer::del($id);
        }
    });
    return $emitter->iterate();
}
$worker->onMessage = function ($connection) {
    $iterator = subtractToZero(10, 1);
    while (yield $iterator->advance())
        var_dump($iterator->getCurrent());
    $connection->send('ok');
};
Worker::runAll();

有关Amp框架的基本使用,如果觉得官网上的文档不够清楚,可以参考我给单位的新人们培训时用的文档