workbunny / event-loop
A high-performance event loop library for PHP
1.2.1
2023-09-14 10:14 UTC
Requires
- php: >=8.1
Requires (Dev)
- phpunit/phpunit: ^10.0
- swow/swow: ^1.0
- symfony/var-dumper: ^6.0
Suggests
- ext-ev: For EvLoop.
- ext-event: For EventLoop.
- ext-pcntl: Let NativeLoop support signal handling.
- swow/swow: For SwowLoop.
README
workbunny/event-loop
🐇 A high-performance event loop library for PHP 🐇
简介
一个事件循环库,目的是为了构建高性能网络应用。
使用
注:本文档为 1.2.x 版本,旧版请点击 1.1.x 版本 跳转 注:swowloop还未完成单元测试,敬请等待
安装
composer require workbunny/event-loop
创建loop
use WorkBunny\EventLoop\Loop; use WorkBunny\EventLoop\Drivers\NativeLoop; use WorkBunny\EventLoop\Drivers\EventLoop; use WorkBunny\EventLoop\Drivers\EvLoop; use WorkBunny\EventLoop\Drivers\SwowLoop; // 创建PHP原生loop $loop = Loop::create(NativeLoop::class); // 创建ext-event loop $loop = Loop::create(EventLoop::class); // 创建ext-ev loop $loop = Loop::create(EvLoop::class); // 创建swow loop $loop = Loop::create(SwowLoop::class);
注册loop
- 创建 YourLoopClass 实现 LoopInterface
- 调用 Loop::register() 注册 YourLoopClass
use WorkBunny\EventLoop\Loop; // 注册 loop::register(YourLoopClass::class); // 创建 $yourLoop = Loop::create(YourLoopClass::class);
创建定时器
- Future 触发器
/** * @Future [delay=0.0, repeat=false] * 在下一个周期执行,执行一次即自动销毁 */ $loop->addTimer(0.0, false, function (){ echo 'timer'; }); // loop->run()后立即输出字符串
- ReFuture 重复触发器
/** * @ReFuture [delay=0.0, repeat=0.0] * 在每一个周期执行,不会自动销毁 */ $id = $loop->addTimer(0.0, 0.0, function () use(&$loop, &$id) { // 此方法可以实现自我销毁 $loop->delTimer($id); });
- DelayReFuture 延迟的重复触发器
/** * @DelayReFuture [delay>0.0, repeat=0.0] * 延迟delay秒后每一个周期执行,不会自动销毁 */ $id = $loop->addTimer(1.0, 0.0, function () use(&$loop, &$id) { // 此方法可以实现自我销毁 $loop->delTimer($id); });
- Delayer 延迟器
/** * @Delayer [delay>0.0, repeat=false] * 延迟delay秒后执行,执行一次即自动销毁 */ $loop->addTimer(2.0, false, function (){ echo 'timer'; }); // loop->run() 2秒后输出字符串
- Timer 定时器
/** * @Timer [delay=0.0, repeat>0.0] * 在下一个周期开始每间隔repeat秒执行,不会自动销毁 */ $id = $loop->addTimer(0.1, 0.1, function () use(&$loop, &$id) { // 此方法可以实现自我销毁 $loop->delTimer($id); });
- DelayTimer 延迟的定时器
/** * @DelayTimer [delay>0.0, repeat>0.0] * 延迟delay秒后每间隔repeat秒执行,不会自动销毁 */ $id = $loop->addTimer(0.2, 0.1, function () use(&$loop, &$id) { // 此方法可以实现自我销毁 $loop->delTimer($id); });
流事件
这里的流是指 PHP Streams
- 读取流
// 创建 $loop->addReadStream(resource, function (resource $stream) { }); // 注意:EvLoop在这里较为特殊,回调函数的入参为EvIo对象 $loop->addReadStream(resource, function (\EvIo $evio) { $evio->stream // resource 资源类型 }); // 移除 $loop->delReadStream(resource);
- 写入流
// 创建 $loop->addWriteStream(resource, function (resource $stream) { }); // 注意:EvLoop在这里较为特殊,回调函数的入参为EvIo对象 $loop->addWriteStream(resource, function (\EvIo $evio) { $evio->stream // resource 资源类型 }); // 移除 $loop->delWriteStream(resource);
信号事件
用于接收系统的信号,比如kill等
// 注册 $loop->addSignal(\SIGUSR1, function (){}); // 移除 $loop->delSignal(\SIGUSR1, function (){});
启动/停止
-
启动
以下代码会持续阻塞,请放在程序最后一行
# 该函数后会阻塞 $loop->loop(); # 该行代码不会执行 var_dump('123');
-
停止
以下代码不会阻塞等待
$loop->destroy(); # 该行代码会执行 var_dump('123');