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/redis 支持 Fiber 协程
参考手册 workerman/redis
提示 内网尤其是本机 redis 调用非常快,所以大部分情况下使用多进程 + redis 扩展性能是最好的,无需使用
workerman/redis
或者其它协程 redis 客户端
支持 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();