写点什么

高性能 PHP 应用容器之 Workerman

作者:CRMEB
  • 2022 年 5 月 28 日
  • 本文字数:2016 字

    阅读完需:约 7 分钟

高性能 PHP 应用容器之 Workerman

介绍 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;


// 接收请求


connection, $request) {


# 获取整个 get 数组


$request->get();


# 获取 get 数组的某一个值


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 回调。


connection) {


echo "New connection\n";


};


// 当客户端通过连接发来数据时触发


connection, $data) {


// 和客户端发送消息


data);


};


// 当客户端连接与 Workerman 断开时触发的回调


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 callback [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)


{


// 每 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


配置 config/console.php 文件


项目根目录执行:


php think timer start


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


链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27提取码: yu27 百度云链接不稳定,随时可能会失效,大家抓紧保存哈。


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


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


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

用户头像

CRMEB

关注

还未添加个人签名 2021.11.02 加入

CRMEB就是客户关系管理+营销电商系统实现公众号端、微信小程序端、H5端、APP、PC端用户账号同步,能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、会员维护、网络营销的一款企业应用

评论

发布
暂无评论
高性能 PHP 应用容器之 Workerman_CRMEB_InfoQ写作社区