workerman目前支持的事件驱动

名称 依赖扩展 支持协程 优先级 workerman版本
Workerman\Events\Select 不支持 内核默认支持 >=3.0 |
Workerman\Events\Revolt event(可选) 支持 需安装revolt/event-loop >=5.0
Workerman\Events\Event event 不支持 内核默认支持 >=3.0
Workerman\Events\Swoole swoole 支持 需手动设置 >=4.0
Workerman\Events\Swow swow 支持 需手动设置 >=5.0
  • 每种内核驱动会提供单独的特性,例如使用Revolt会让workerman支持PHP内置的Fiber协程(纤程),使用Swoole则会让workerman支持Swoole的协程
  • 各个事件驱动之间是互斥关系,例如使用Revolt的Fiber协程时,无法使用Swoole或者Swow的协程
  • Revolt需要安装composer require revolt/event-loop ^1.0.0,安装后workerman内核自动将其设置为首选事件驱动
  • SwooleSwow需要手动设置Worker::$eventLoopClass才能生效(参见下一段落)
  • swoole默认没有开启一键协程Runtime,也就是说基于Pdo、Redis、PHP内置文件读写仍是阻塞式调用
  • 如需swoole开启一键协程,需要手动调用 \Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL);

注意
swow扩展会自动更改一些PHP内置函数的行为,这会导致开启了swow扩展但是没有使用swow作为事件驱动时,workerman无法响应请求以及信号,所以如果您不使用swow作为底层驱动时,需要将swow从php.ini中注释掉

更多参考workerman协程

为workerman设置事件驱动

以下是为workerman手动设置事件驱动

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Swoole\Coroutine\Http\Client;
use Swoole\Coroutine;

// 手动设置为底层事件驱动
Worker::$eventLoopClass = Workerman\Events\Revolt::class;
//Worker::$eventLoopClass = Workerman\Events\Select::class;
//Worker::$eventLoopClass = Workerman\Events\Event::class;
//Worker::$eventLoopClass = Workerman\Events\Swoole::class;
//Worker::$eventLoopClass = Workerman\Events\Swow::class;
$worker = new Worker('http://0.0.0.0:12345');
$worker->onMessage = static function($connection, $request)
{
    Coroutine::create(function() use ($connection) {
        $cli = new Client('example.com', 80);
        $cli->get('/get');
        $connection->send($cli->body);
    });
};

Worker::runAll();
编辑于2024-03-13 17:37:19 完善本页 +发起讨论
赞助商
×