Skip to content

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
<?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();

基于 MIT 许可发布