后端【免费下载链接】workermanAn asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols.项目地址https://gitcode.com/gh_mirrors/wo/workerman点击查看免费下载Workerman 是一个使用纯 PHP 编写、基于事件驱动的异步网络通信框架可用于构建高性能、可扩展的实时网络应用覆盖 HTTP、WebSocket、自定义 TCP 协议、协程与连接池等场景。本指南以当前仓库 README.md 为主线结合 src 目录源码与 tests 测试用例系统讲解环境要求、安装、四种典型服务端写法、SSL 加密、异步客户端、协程四大并发原语、连接池以及完整的命令行运维体系。框架概述与适用场景Workerman 的核心定位是在 PHP 中构建长期常驻内存、支持高并发连接的异步网络服务。它采用事件驱动模型通过一个主进程管理多个 Worker 子进程每个 Worker 负责监听端口并处理连接事件从而突破传统 PHP-FPM请求结束即销毁的短生命周期模式。从当前仓库结构可以确认框架的主要组成模块src/Worker.php核心 Worker 类负责进程管理、端口监听、事件循环初始化与命令行调度src/Connection连接抽象层包含 TcpConnection.php、AsyncTcpConnection.php、UdpConnection.php 等src/Events事件循环实现包括 Select.php、Event.php、Swoole.php、Swow.php、Fiber.php、Ev.phpsrc/Protocols应用层协议解析包括 HTTP、WebSocket、Text、Frame 等。运行环境要求根据 README 与 composer.json 的约束运行 Workerman 需要满足以下条件项目要求PHP 版本 8.1仓库 composer.json 中require明确要求操作系统POSIX 兼容系统Linux、macOS、BSDPHP 扩展必须安装 POSIX 与 PCNTL 扩展性能增强扩展推荐安装 Event / Swoole / Swow 扩展以获得更好性能其中 PCNTL进程控制与 POSIX 扩展是运行的基础前提。在 Worker.php 的checkSapiEnv()方法中框架会显式检查pcntl与posix扩展是否加载若缺失会直接提示安装。同时该方法还校验了一组关键函数stream_socket_server、pcntl_fork、posix_kill等是否被disable_functions禁用并确认只能通过命令行 SAPI 运行——这意味着 Workerman 程序必须以php start.php方式启动无法运行在传统 Web 服务器环境中。安装使用 Composer 一条命令即可完成安装composer require workerman/workerman仓库 composer.json 展示了依赖关系项目依赖于workerman/coroutine包提供协程能力并将ext-event列为建议安装项For better performance。从源码结构看当安装了ext-event扩展时框架会自动选用 Event 事件循环否则回退到 Select 事件循环见 Worker.php 的initGlobalEvent()方法。构建一个 WebSocket 服务端这是 Workerman 最经典的入门示例。创建一个start.php文件内容如下完整代码见 README.md?php use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // Create a Websocket server $ws_worker new Worker(websocket://0.0.0.0:2346); // Emitted when new connection come $ws_worker-onConnect function ($connection) { echo New connection\n; }; // Emitted when data received $ws_worker-onMessage function ($connection, $data) { // Send hello $data $connection-send(Hello . $data); }; // Emitted when connection closed $ws_worker-onClose function ($connection) { echo Connection closed\n; }; // Run worker Worker::runAll();代码要点解析new Worker(websocket://0.0.0.0:2346)协议与监听地址合一的写法websocket://指定应用层协议0.0.0.0:2346表示监听所有网卡的 2346 端口onConnect/onMessage/onClose三个核心事件回调分别在连接建立、收到数据、连接关闭时触发Worker::runAll()启动框架的主入口。从 Worker.php 的源码可以看到runAll()内部依次完成 SAPI 环境检查、初始化、命令解析、端口可用性检查、守护进程化、Worker 初始化、信号安装、主进程 PID 保存、UI 展示、子进程 fork 与监控等一整套流程。仓库 tests/Feature 目录下提供了配套的 WebSocket 测试桩与测试用例WebsocketServer.php 定义服务端WebsocketServiceTest.php 验证握手与消息收发逻辑可作为实际开发时参考的服务端骨架。构建一个 HTTP 服务端HTTP 服务端与 WebSocket 服务端写法几乎一致区别在于协议前缀与多进程配置use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // #### http worker #### $http_worker new Worker(http://0.0.0.0:2345); // 4 processes $http_worker-count 4; // Emitted when data received $http_worker-onMessage function ($connection, $request) { //$request-get(); //$request-post(); //$request-header(); //$request-cookie(); //$request-session(); //$request-uri(); //$request-path(); //$request-method(); // Send data to client $connection-send(Hello World); }; // Run all workers Worker::runAll();要点说明$http_worker-count 4设置该 Worker 启动 4 个子进程。count是 Worker.php 中定义的公开属性默认值为 1。多进程能充分利用多核 CPU但每个进程独立维护自己的连接集合onMessage回调的第二个参数是$request即 src/Protocols/Http/Request.php 封装好的请求对象可以链式调用get()、post()、header()、cookie()、session()、uri()、path()、method()等方法来获取请求信息HTTP 协议解析逻辑位于 src/Protocols/Http.php仓库中的 HttpTest.php 对协议解析、请求封装做了系统测试。仓库还提供了 HttpServer.php 测试桩与 HttpConnectionTest.php 特征测试通过 GuzzleHttp 客户端实际发起 GET/POST 请求并断言状态码、响应体与 JSON 内容验证了 HTTP 服务的完整收发链路。构建一个 TCP 服务端当需要自定义二进制协议或私有文本协议时可以直接使用底层 TCPuse Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // #### create socket and listen 1234 port #### $tcp_worker new Worker(tcp://0.0.0.0:1234); // 4 processes $tcp_worker-count 4; // Emitted when new connection come $tcp_worker-onConnect function ($connection) { echo New Connection\n; }; // Emitted when data received $tcp_worker-onMessage function ($connection, $data) { // Send data to client $connection-send(Hello $data \n); }; // Emitted when connection is closed $tcp_worker-onClose function ($connection) { echo Connection closed\n; }; Worker::runAll();这里onMessage收到的$data是原始字符串数据按换行或框架内部缓冲分割。如果需要在此基础上定义自己的协议可以参考 src/Protocols 目录下的协议实现方式并实现 ProtocolInterface.php 约定的接口。启用 SSL 加密传输通过 SSL 上下文与transport属性可以轻松让 WebSocket 升级为安全版本wss://HTTP 升级为https://?php use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // SSL context. $context [ ssl [ local_cert /your/path/of/server.pem, local_pk /your/path/of/server.key, verify_peer false, ] ]; // Create a Websocket server with ssl context. $ws_worker new Worker(websocket://0.0.0.0:2346, $context); // Enable SSL. WebSocketSSL means that Secure WebSocket (wss://). // The similar approaches for Https etc. $ws_worker-transport ssl; $ws_worker-onMessage function ($connection, $data) { // Send hello $data $connection-send(Hello . $data); }; Worker::runAll();配置解析$context[ssl]PHP 流上下文local_cert指向服务端证书PEM 格式local_pk指向私钥verify_peer置为false表示服务端不要求校验客户端证书典型的一对一认证场景$ws_worker-transport ssl将传输层切换为 SSL。transport是 Worker.php 中定义的公开属性默认值为tcp可改为ssl、tls等同一套机制对 HTTPS 同样适用把 Worker 的监听协议换成http://并设置transport ssl即可。SSL 连接的底层处理可以参考 SslConnectionTest.php 测试用例它对 SSL 场景的连接建立与数据传输有专门验证。使用 AsyncTcpConnection 构建异步客户端AsyncTcpConnection让 Workerman 进程能够主动作为客户端异步地连接外部服务如 WebSocket 服务、HTTP API、TCP 长连接等适用于网关、代理、消息推送等场景。完整示例见 README.mduse Workerman\Worker; use Workerman\Connection\AsyncTcpConnection; require_once __DIR__ . /vendor/autoload.php; $worker new Worker(); $worker-onWorkerStart function () { // Websocket protocol for client. $ws_connection new AsyncTcpConnection(ws://echo.websocket.org:80); $ws_connection-onConnect function ($connection) { $connection-send(Hello); }; $ws_connection-onMessage function ($connection, $data) { echo Recv: $data\n; }; $ws_connection-onError function ($connection, $code, $msg) { echo Error: $msg\n; }; $ws_connection-onClose function ($connection) { echo Connection closed\n; }; $ws_connection-connect(); }; Worker::runAll();关键点说明这里创建的是一个不带监听地址的 Workernew Worker()所有异步连接都放在onWorkerStart回调中发起确保在 Worker 进程启动完成后才建立外部连接AsyncTcpConnection位于 src/Connection/AsyncTcpConnection.php它继承自 TcpConnection.php。从源码看它声明了BUILD_IN_TRANSPORTS常量支持tcp、udp、unix、ssl、sslv2、sslv3、tls等内置传输层协议连接地址同样采用协议://IP:端口格式支持ws://、tcp://、text://、frame://等例如示例中的ws://echo.websocket.org:80即用于连接外部的 WebSocket 回显服务相比同步阻塞式file_get_contents异步连接不会阻塞当前 Worker 进程可同时维护成百上千个外部连接。协程支持四种并发原语Workerman 5.x 在事件驱动之上引入了**协程Coroutine**能力用于将异步任务降维为同步写法大幅提升单进程内的并发性能。注意协程功能依赖 Swoole 扩展、Swow 扩展或 revoltphp/event-loop对应Fiber::class事件循环README 中所有协程示例的eventLoop设置均以此为前提。框架本身提供 src/Events/Swoole.php、src/Events/Swow.php、src/Events/Fiber.php 三个协程事件循环实现以及Workerman\Coroutine命名空间下的协程工具类。切换协程事件循环协程示例中统一使用$worker-eventLoop属性指定事件循环$worker-eventLoop Swoole::class; // Or Swow::class or Fiber::classeventLoop是 Worker.php 中定义的公开属性运行时该值会覆盖全局默认事件循环类默认逻辑见initGlobalEvent()安装了event扩展用Event::class否则用Select::class。1. Coroutine创建异步任务Coroutine::create用于创建协程让耗时的异步操作如 HTTP 请求并发执行同时立即返回主流程继续处理?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { Coroutine::create(function () { echo file_get_contents(http://www.example.com/event/notify); }); $connection-send(ok); }; Worker::runAll();注意示例中onMessage回调使用了类型声明TcpConnection $connection与Request $request这是框架提供的类型安全的回调签名。2. Barrier并发任务同步等待Barrier 用于管理协程间的并发与同步所有协程并行执行Barrier::wait()会阻塞等待全部任务完成后才继续确保流程同步?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Barrier; use Workerman\Coroutine; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { $barrier Barrier::create(); for ($i1; $i5; $i) { Coroutine::create(function () use ($barrier, $i) { file_get_contents(http://127.0.0.1:8002?task_id$i); }); } // Wait all coroutine done Barrier::wait($barrier); $connection-send(All Task Done); }; // Task Server $task new Worker(http://0.0.0.0:8002); $task-onMessage function (TcpConnection $connection, Request $request) { $task_id $request-get(task_id); $message Task $task_id Done; echo $message . PHP_EOL; $connection-close($message); }; Worker::runAll();示例演示了典型的聚合请求模式HTTP 服务器收到一次请求后并发调用 4 个任务接口全部完成后统一响应All Task Done。这里还用到了两个 Worker 实例8001与8002端口在同一个进程内共存的写法Worker::runAll()会同时启动它们。3. Parallel并发执行并收集结果与 Barrier 不同Parallel 会直接返回每个任务的返回值通过add()添加任务、wait()等待完成并取得结果数组?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Parallel; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { $parallel new Parallel(); for ($i1; $i5; $i) { $parallel-add(function () use ($i) { return file_get_contents(http://127.0.0.1:8002?task_id$i); }); } $results $parallel-wait(); $connection-send(json_encode($results)); // Response: [Task 1 Done,Task 2 Done,Task 3 Done,Task 4 Done] }; // Task Server $task new Worker(http://0.0.0.0:8002); $task-onMessage function (TcpConnection $connection, Request $request) { $task_id $request-get(task_id); $message Task $task_id Done; $connection-close($message); }; Worker::runAll();示例运行后客户端收到的响应为[Task 1 Done,Task 2 Done,Task 3 Done,Task 4 Done]——每个任务协程的return值按顺序收集进结果数组。4. Channel协程间数据通信Channel 提供协程之间的数据传递通道一个协程向通道push数据另一个协程从通道pop数据实现同步与数据共享。new Channel(2)中的数字表示通道容量缓冲大小?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Channel; use Workerman\Coroutine; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { $channel new Channel(2); Coroutine::create(function () use ($channel) { $channel-push(Task 1 Done); }); Coroutine::create(function () use ($channel) { $channel-push(Task 2 Done); }); $result []; for ($i 0; $i 2; $i) { $result[] $channel-pop(); } $connection-send(json_encode($result)); // Response: [Task 1 Done,Task 2 Done] }; Worker::runAll();示例中两个协程分别向容量为 2 的通道推送结果主流程连续pop两次取出数据最终响应[Task 1 Done,Task 2 Done]。连接池复用资源提升性能Pool 用于管理连接或资源池通过复用例如数据库连接来减少重复建立/销毁的开销。核心 API 包括get()获取资源、put()归还资源、setConnectionCreator()设置创建函数、setConnectionCloser()设置销毁函数、setHeartbeatChecker()设置心跳检测函数。基础用法手动获取与归还?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Pool; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; class RedisPool { private Pool $pool; public function __construct($host, $port, $max_connections 10) { $pool new Pool($max_connections); $pool-setConnectionCreator(function () use ($host, $port) { $redis new \Redis(); $redis-connect($host, $port); return $redis; }); $pool-setConnectionCloser(function ($redis) { $redis-close(); }); $pool-setHeartbeatChecker(function ($redis) { $redis-ping(); }); $this-pool $pool; } public function get(): \Redis { return $this-pool-get(); } public function put($redis): void { $this-pool-put($redis); } } // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { static $pool; if (!$pool) { $pool new RedisPool(127.0.0.1, 6379, 10); } $redis $pool-get(); $redis-set(key, hello); $value $redis-get(key); $pool-put($redis); $connection-send($value); }; Worker::runAll();实现说明new Pool($max_connections)创建容量上限为 10 的连接池创建器Creator负责建立真实连接new Redis并connect销毁器Closer负责释放close()心跳检测器HeartbeatChecker通过ping()维持连接活性onMessage中使用static $pool让连接池在进程内只初始化一次这是常驻内存进程复用资源的关键写法。进阶用法协程内自动获取与释放结合协程上下文Context与Coroutine::defer可以在同一协程内复用同一个连接并在协程销毁时自动归还完全隐藏池的获取/归还逻辑?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Context; use Workerman\Coroutine; use Workerman\Coroutine\Pool; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; class Db { private static ?Pool $pool null; public static function __callStatic($name, $arguments) { if (self::$pool null) { self::initializePool(); } // Get the connection from the coroutine context // to ensure the same connection is used within the same coroutine $pdo Context::get(pdo); if (!$pdo) { // If no connection is retrieved, get one from the connection pool $pdo self::$pool-get(); Context::set(pdo, $pdo); // When the coroutine is destroyed, return the connection to the pool Coroutine::defer(function () use ($pdo) { self::$pool-put($pdo); }); } return call_user_func_array([$pdo, $name], $arguments); } private static function initializePool(): void { self::$pool new Pool(10); self::$pool-setConnectionCreator(function () { return new \PDO(mysql:host127.0.0.1;dbnameyour_database, your_username, your_password); }); self::$pool-setConnectionCloser(function ($pdo) { $pdo null; }); self::$pool-setHeartbeatChecker(function ($pdo) { $pdo-query(SELECT 1); }); } } // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { $value Db::query(SELECT NOW() as now)-fetchAll(); $connection-send(json_encode($value)); }; Worker::runAll();这套模式有两个关键设计协程上下文Context保证同一协程内复用同一条连接第一次调用时从池中get()并写入上下文后续调用直接取上下文中的连接避免同一协程内重复获取Coroutine::defer()保证连接自动归还注册协程销毁时的回调在协程结束时将连接放回池中业务代码无需关心池的细节。命令行运维命令Workerman 提供了完整的命令行操作体系启动脚本假设为start.php支持以下命令php start.php start php start.php start -d php start.php status php start.php status -d php start.php connections php start.php stop php start.php stop -g php start.php restart php start.php reload php start.php reload -g各命令的含义与底层实现对应 Worker.php 的parseCommand()方法命令说明start以调试模式启动前台运行可直接看到日志输出start -d以守护进程daemon模式后台启动status查看所有 Worker 的运行状态status -d为实时刷新模式每秒动态刷新状态面板connections查看当前所有连接信息stop停止服务发送SIGINT信号stop -g为优雅停止发送SIGQUIT信号等待正在处理的任务完成后再退出restart重启服务restart -d重启并后台运行restart -g优雅重启reload热重载业务代码发送SIGUSR1信号仅重启 Worker 子进程而不中断主进程reload -g为优雅重载发送SIGUSR2信号从 Worker.php 的命令帮助文本可以确认完整命令集为start、stop、restart、reload、status、connections六种。机制细节status命令通过向主进程发送SIGIOT信号收集各子进程统计信息Worker.php再格式化输出进程状态面板connections通过发送SIGIO信号收集连接信息Worker.php优雅停止时设置了$stopTimeout超时控制Worker.php超时未结束的进程会被强制退出。总结围绕当前仓库的 README.md 与 src 源码可以梳理出 Workerman 的核心实践路径三种服务端范式WebSocketwebsocket://、HTTPhttp:// 请求对象、TCPtcp:// 原始数据均通过Worker::runAll()启动靠onConnect/onMessage/onClose事件驱动安全传输通过 SSL 上下文 transport ssl一键升级为wss:///https://主动连接外部用AsyncTcpConnection在 Worker 进程内发起异步客户端连接协程并发基于 Swoole / Swow / Fiber 事件循环使用Coroutine::create、Barrier、Parallel、Channel四种原语处理并发任务资源复用用Pool管理数据库/Redis 等连接池结合Context与Coroutine::defer实现自动获取归还进程运维借助start/status/connections/stop/restart/reload六类命令完成常驻服务的全生命周期管理。实际部署时需满足 PHP 8.1、POSIX 兼容系统、PCNTL 与 POSIX 扩展等前提条件参见 composer.json 与 Worker.php 的启动校验并按需安装 Event / Swoole / Swow 扩展来启用高性能事件循环或协程能力。赞分享后端【免费下载链接】workermanAn asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols.项目地址https://gitcode.com/gh_mirrors/wo/workerman点击查看免费下载相关推荐Workerman高性能PHP异步事件驱动框架深度解析Workerman高性能PHP异步事件驱动框架深度解析 本文深入解析Workerman框架的核心架构、异步事件驱动原理、多协议支持特性及其性能优势。Worke后端Webman基于Workerman的高性能PHP框架Webman基于Workerman的高性能PHP框架 项目基础介绍和主要编程语言 Webman 是一个基于 Workerman 开发的高性能 PHP 框架。W后端Web框架Phalcon微服务与事件驱动架构Phalcon微服务与事件驱动架构 本文深入探讨了Phalcon框架在微服务架构中的应用重点介绍了Micro应用开发模式、事件管理器与观察者模式实现、异步处理后端Web框架上一篇Windows安卓应用安装器三步实现电脑运行手机应用下一篇TrafficMonitor股票插件终极指南在Windows任务栏实时监控你的投资组合创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考