Amp是一个事件驱动的PHP框架,与ReactPHP类似
Amp是一个事件驱动的PHP框架,与ReactPHP类似
PHP 开发框架
共33Star
详细介绍
Workerman-Amp
概述
Amp是一个事件驱动的PHP框架,与ReactPHP类似。
本项目用于将Amp的event-loop应用于Workerman,从而可以在Workerman中使用基于Amp的高性能组件,例如异步MySQL,异步Redis,异步HTTP客户端等。
笔者修改了本项目的源码,使其兼容原生Amp。现在无需修改Amp的源码就可以在项目中使用其所有组件。以后笔者可能会发布一些Demo。
使用说明
- 使用composer将
Workerman\Events\Amp
加载到项目中。
composer require cismonx/workerman-amp
- 将Amp设置为Workerman所使用的event-loop。如下:
Worker::$eventLoopClass = '\\Workerman\\Events\\Amp';
兼容Amp协程
在Amp中,协程是一个十分重要的特性。对Workerman的源码稍加修改,将watcher回调中的同步调用(call_user_func
)改为异步调用(yield \Amp\call()
),即可在Workerman的事件回调函数中直接使用Amp协程。
以下几点需要注意:
-
以上提到的对Workerman源码的修改在src目录下的coroutine-compatibility.patch中。这个补丁对Workerman-3.4.5-stable有效。
-
目前只能在
onConnect
,onSslHandshake
,onMessage
这三个事件回调函数中使用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框架的基本使用,如果觉得官网上的文档不够清楚,可以参考我给单位的新人们培训时用的文档。