Workerman 是一款纯 PHP 开发的开源高性能的 PHP 应用容器。可以用它开发 tcp 代理、梯子代理、做游戏服务器、邮件服务器、ftp 服务器、甚至开发一个 php 版本的 redis、php 版本的数据库、php 版本的 nginx、php 版本的 php-fpm 等等。Workerman 可以说是 PHP 领域的一次创新,让开发者彻底摆脱了 PHP 只能做 WEB 的束缚。
实际上 Workerman 类似一个 PHP 版本的 nginx,核心也是多进程 + Epoll + 非阻塞 IO。 Workerman 每个进程能维持上万并发连接。由于本身常驻内存,不依赖 Apache、nginx、php-fpm 这些容器,拥有超高的性能。同时支持 TCP、UDP、UNIXSOCKET,支持长连接,支持 Websocket、HTTP、WSS、HTTPS 等通讯协议以及各种自定义协议。拥有定时器、异步 socket 客户端、异步 Redis、异步 Http、异步消息队列等众多高性能组件。
安装与操作
设置阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
安装 workerman
composer require workerman/workerman
启动
调试模式
php start.php start
守护进程模式
php start.php start -d
停止
php start.php stop
重启
php start.php restart
平滑重启:不同于普通的重启,平滑重启可以做到在不影响用户的情况下重启服务, 完成业务代码更新。
php start.php reload
查看状态
php start.php status
查看连接状态
php start.php connections
Http 服务器
workerman 提供了 get、post、cookie、session 等组件,可以很方便的进行 http 相关操作。
<?php use Workerman\Worker; require_once __DIR__ . '/vendor/autoload.php'; // 开启 http 服务, 端口号为 2345 $http_worker = new Worker('http://0.0.0.0:2345'); // 启动 4 个进程处理请求 $http_worker->count = 4; // 接收请求 $http_worker->onMessage = function ($connection, $request) { # 获取整个 get 数组 $request->get(); # 获取 get 数组的某一个值 $name = $request->get('name'); # 发送 hello 返回给浏览器客户端 $connection->send("hello"); }; // 运行 worker Worker::runAll(); - 启动后,在浏览器访问 `http://127.0.0.1:2345` 会看到 `Hello World`,一个基础的 `http` 服务器就完成了。 websocket 服务器 服务端 <?php use Workerman\Worker; require_once __DIR__ . '/vendor/autoload.php'; // 创建 websocket 服务, 端口号为 2346 $ws_worker = new Worker('websocket://0.0.0.0:2346'); // 当客户端与 Workerman 建立连接时触发, 每个连接只会触发一次 onConnect 回调。 $ws_worker->onConnect = function ($connection) { echo "New connection\n"; }; // 当客户端通过连接发来数据时触发 $ws_worker->onMessage = function ($connection, $data) { // 和客户端发送消息 $connection->send('msg: ' . $data); }; // 当客户端连接与 Workerman 断开时触发的回调 $ws_worker->onClose = function ($connection) { echo "Connection closed\n"; }; // 运行 worker Worker::runAll(); 客户端 var ws = new WebSocket("ws://localhost:2346"); ws.onopen = function() { // Web Socket 已连接上,使用 send () 方法发送数据 ws.send("customer"); }; ws.onmessage = function (evt) { console.log("接收数据..."); console.log(evt.data) }; ws.onclose = function() { // 关闭 websocket console.log("连接已关闭..."); }; - 打开控制台,可以看到服务端发送的 `msg:customer` ,一个简单的聊天服务器就搭建起来了。 Timer 定时器 Timer::add(float $time_interval, callable $callback [$args = array(), bool $persistent = rue]) # time_interval: 多长时间执行一次,单位秒,支持小数,可以精确到 0.001,即精确到毫秒级别。 # callback: 回调函数 # args: 回调函数的参数,必须为数组,数组元素为参数值 # persistent: 是否是持久的,如果只想定时执行一次,则传递 false,执行一次后自动销毁。 示例 <?php use Workerman\Worker; use Workerman\Timer; require_once __DIR__ . '/vendor/autoload.php'; $task = new Worker(); // 开启 1 个进程运行定时任务 $task->count = 1; $task->onWorkerStart = function(Worker $task) { // 每 2.5 秒执行一次 $time_interval = 2.5; Timer::add($time_interval, function() { echo "timer run\n"; }); }; // 运行 worker Worker::runAll(); 定时任务示例 定时器可以很方便的完成定时任务的功能,例如和 `ThinkPHP` 框架的事件相结合,通过事件来触发自动收货、取消订单、统计等功能,下面是 。 创建自定义命令 php think make:command crmeb\command\Timer timer ![在这里插入图片描述](https://img-blog.csdnimg.cn/c24b98e6b03a4c07a3298b1cdb2aefc4.png) 配置 `config/console.php` 文件 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b2baabba99da4a7dac09096f3cb38c98.png) 项目根目录执行: php think timer start ![在这里插入图片描述](https://img-blog.csdnimg.cn/9f275165e65d4a91873bb371a1f6796b.png)