高性能 PHP 应用容器之 Workerman

570 阅读2分钟

介绍

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 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 相关操作。

  1. use Workerman\Worker;  
  2. require_once DIR . '/vendor/autoload.php';  
  3. // 开启 http 服务, 端口号为 2345  
  4. $http_worker = new Worker('http://0.0.0.0:2345');  
  5. // 启动 4 个进程处理请求  
  6. $http_worker->count = 4;  
  7. // 接收请求  
  8. httpworker>onMessage = function (http_worker->onMessage = **function** (connection, $request) {  
  9.     # 获取整个 get 数组  
  10.     $request->get();  
  11.     # 获取 get 数组的某一个值  
  12.     name = name = request->get('name');  
  13.     # 发送 hello 返回给浏览器客户端  
  14.     $connection->send("hello");  
  15. };  
  16. // 运行 worker  
  17. Worker::runAll();  
  • 启动后,在浏览器访问 http://127.0.0.1:2345 会看到 Hello World,一个基础的 http 服务器就完成了。

websocket 服务器

服务端

  1.       
  2. use Workerman\Worker;  
  3.   
  4. require_once DIR . '/vendor/autoload.php';  
  5.   
  6. // 创建 websocket 服务, 端口号为 2346  
  7. $ws_worker = new Worker('websocket://0.0.0.0:2346');  
  8.   
  9. // 当客户端与 Workerman 建立连接时触发, 每个连接只会触发一次 onConnect 回调。  
  10. wsworker>onConnect = function (ws_worker->onConnect = **function** (connection) {  
  11.     echo "New connection\n";  
  12. };  
  13.   
  14. // 当客户端通过连接发来数据时触发  
  15. wsworker>onMessage = function (ws_worker->onMessage = **function** (connection, $data) {  
  16.     // 和客户端发送消息  
  17.     connection>send(msg:  . connection->send('msg: ' . data);  
  18. };  
  19.   
  20. // 当客户端连接与 Workerman 断开时触发的回调  
  21. wsworker>onClose = function (ws_worker->onClose = **function** (connection) {  
  22.     echo "Connection closed\n";  
  23. };  
  24.   
  25. // 运行 worker  
  26. Worker::runAll();  

客户端

  1. var ws = new WebSocket("ws://localhost:2346");                  
  2. ws.onopen = function()  
  3. {  
  4.     // Web Socket 已连接上,使用 send () 方法发送数据  
  5.     ws.send("customer");  
  6. };  
  7.   
  8. ws.onmessage = function (evt)   
  9. {   
  10.     console.log("接收数据...");  
  11.     console.log(evt.data)  
  12. };  
  13.   
  14. ws.onclose = function()  
  15. {   
  16.     // 关闭 websocket  
  17.     console.log("连接已关闭...");   
  18. };  
  • 打开控制台,可以看到服务端发送的 msg:customer ,一个简单的聊天服务器就搭建起来了。

Timer 定时器

  1. Timer::add(float timeinterval, callable time_interval, callable callback [args = array(), bool args = **array**(), bool persistent = rue])  
  2. # time_interval: 多长时间执行一次,单位秒,支持小数,可以精确到 0.001,即精确到毫秒级别。  
  3. # callback: 回调函数  
  4. # args: 回调函数的参数,必须为数组,数组元素为参数值  
  5. # persistent: 是否是持久的,如果只想定时执行一次,则传递 false,执行一次后自动销毁。   

示例

  1.       
  2. use Workerman\Worker;  
  3. use Workerman\Timer;  
  4.   
  5. require_once DIR . '/vendor/autoload.php';  
  6.   
  7. $task = new Worker();  
  8.   
  9. // 开启 1 个进程运行定时任务  
  10. $task->count = 1;  
  11.   
  12. task>onWorkerStart = function(Worker task->onWorkerStart = **function**(Worker task)  
  13. {  
  14.     // 每 2.5 秒执行一次  
  15.     $time_interval = 2.5;  
  16.     Timer::add($time_interval, function()  
  17.     {  
  18.         echo "timer run\n";  
  19.     });  
  20. };  
  21.   
  22. // 运行 worker  
  23. Worker::runAll(); 

定时任务示例

定时器可以很方便的完成定时任务的功能,例如和 ThinkPHP 框架的事件相结合,通过事件来触发自动收货、取消订单、统计等功能,下面是 。

创建自定义命令

php think make:command crmeb\command\Timer timer

配置 config/console.php 文件

项目根目录执行:

php think timer start

源码附件已经打包好上传到百度云了,大家自行下载即可~

链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27
提取码: yu27

百度云链接不稳定,随时可能会失效,大家抓紧保存哈。

如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~

开源地址

码云地址:
github.crmeb.net/u/defu

Github 地址:
github.crmeb.net/u/defu