Skip to content

workerman 5.0 功能特性及变更

安装

composer require workerman/workerman ^5.0.0-beta.2

提示 workerman v5 要求 php>=8.1

支持 Fiber 协程

参考 Fiber 协程

Timer::sleep()

workerman 内核增加了 Timer::sleep(float $delay) 方法,将当前协程睡眠固定秒数 (不会阻塞当前进程)

注意 此特性需要安装 composer require revolt/event-loop ^1.0.0 ,或者使用 Swoole/Swow 作为事件驱动

workerman/http-client 支持 Fiber 协程

参考手册 workerman/http-client

workerman/redis 支持 Fiber 协程

参考手册 workerman/redis

提示 内网尤其是本机 redis 调用非常快,所以大部分情况下使用多进程 + redis 扩展性能是最好的,无需使用 workerman/redis 或者其它协程 redis 客户端

支持 swoole 作为底层事件驱动

参考手册协程 - Swoole 作为事件驱动

websocket 握手

workerman v5 更改了 onWebSocketConnect 回调参数类型,去掉了 $_SERVER $_GET 等超级变量的支持。

在 workerman v5 之前

php
<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Connection\TcpConnection;
use Workerman\Worker;

$worker = new Worker('websocket://0.0.0.0:8181');
$worker->onWebSocketConnect = function(TcpConnection $connection, string $httpBuffer) {
    // 可以在这里判断连接来源是否合法,不合法就关掉连接
    // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket连接
    if ($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net') {
        $connection->close();
    }
    // onWebSocketConnect 里面$_GET $_SERVER是可用的
    // var_dump($_GET, $_SERVER);
};
$worker->onMessage = static function($connection, $request) {};

在 workerman v5 之后

php
<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;

$worker = new Worker('websocket://0.0.0.0:12345');
$worker->onWebSocketConnect = function (TcpConnection $connection, Request $request) {
    if ($request->header('origin') != 'https://www.workerman.net') {
        $connection->close();
    }
    var_dump($request->get());
    var_dump($request->header());
};
$worker->onMessage = static function($connection, $request) {};

Worker::runAll();

基于 MIT 许可发布