2 回复

请求接口时,代码业务里面有异步连接(AsyncConnection)时出现问题。。。

提问xiewen_kevin 回复了问题 • 2 人关注 • 2021-05-30 22:45 • 来自相关话题

0 回复

webman - 处理任务

回复

提问evilk 发起了问题 • 1 人关注 • 2021-05-30 22:23 • 来自相关话题

1 回复
1 回复

webman-redis-queue

提问latin 回复了问题 • 2 人关注 • 2021-05-30 13:33 • 来自相关话题

0 回复
2 回复

使用gateway,关于大量耗时业务的想法

提问dingdejing 回复了问题 • 2 人关注 • 2021-05-29 23:53 • 来自相关话题

3 回复

高并发下,异步任务的数据接收延迟问题

提问cqqjj1029 回复了问题 • 4 人关注 • 2021-05-29 18:24 • 来自相关话题

2 回复

gateway worker mermory 内存越来越高。-

提问weilewantieba 发表了文章 • 2 个评论 • 111 次浏览 • 2021-05-29 12:06 • 来自相关话题

我一直调试了。应该是业务逻辑导致的内存溢出。 workerman本身非常稳定,没用内存泄漏。目前总结内存占用越来越高一般是以下原因导致的。 1、业务代码问题,比如使用了全局变量数组或者类的某个属性是数组,数组中的元素个数一直在增加,导致 ...查看全部



我一直调试了。应该是业务逻辑导致的内存溢出。
workerman本身非常稳定,没用内存泄漏。目前总结内存占用越来越高一般是以下原因导致的。
1、业务代码问题,比如使用了全局变量数组或者类的某个属性是数组,数组中的元素个数一直在增加,导致内存占用越来越大
2、使用了某些质量有问题的php类库,类库里面同样因为1的问题导致内存不断增长
3、某个扩展bug导致。有些扩展在使用过程中内存会不断增大。(这种情况比较少见)
$gatewayClients, $clientGateway, $uidConnections ,
因为我项目逻辑是游戏。所以很复杂 没法停机调试。所以提问一下有没有办法不停服务的清空下 打印这3个参数查看内容.

3 回复

thinkphp如何调用workman传值

提问dpdzq 回复了问题 • 2 人关注 • 2021-05-28 23:34 • 来自相关话题

6 回复

如何与其他平台实现数据对接

建议dpdzq 回复了问题 • 4 人关注 • 2021-05-28 20:42 • 来自相关话题

2 回复

webman Redis消息队列组件redis-queue 做短信发送 只能开1个进程跑吗

提问dagongxia 回复了问题 • 2 人关注 • 2021-05-28 18:24 • 来自相关话题

1 回复

symfony console 整合 workman 的问题, 多个command 会导致 already running 问题

提问latin 回复了问题 • 2 人关注 • 2021-05-28 17:48 • 来自相关话题

1 回复

希望 jsonRpc , workerman-statistics 等其他库也能升级到 workman 4 的版本依赖

建议cai584887013 回复了问题 • 2 人关注 • 2021-05-28 17:19 • 来自相关话题

1 回复

求助,Windows下启动workerman这段命令是什么意思?

提问智佳思远 回复了问题 • 3 人关注 • 2021-05-28 16:29 • 来自相关话题

0 回复

workerman/http-client 能给每个请求单独设置超时吗?

回复

提问blesswarrior 发起了问题 • 1 人关注 • 2021-05-28 12:01 • 来自相关话题

0 回复

记录一下getAllClientCount和getAllClientSessions为空的情况

回复

分享wanglong126 发起了问题 • 1 人关注 • 2021-05-28 11:17 • 来自相关话题

1 回复

failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET

提问xiuwang 回复了问题 • 2 人关注 • 2021-05-27 18:25 • 来自相关话题

1 回复

GlobalData变量共享组件如何可以异步赋值?不阻塞当前进程?

提问xiuwang 回复了问题 • 2 人关注 • 2021-05-27 18:08 • 来自相关话题

2 回复

workerman 毫秒级选择性延迟响应,有好的方案吗?

提问zhouaini528 回复了问题 • 3 人关注 • 2021-05-27 16:14 • 来自相关话题

1 回复

返回信息怎么入库

提问cai584887013 回复了问题 • 2 人关注 • 2021-05-27 10:42 • 来自相关话题

1 回复

stream_socket_client(): unable to connect to tcp://0.0.0.0

提问xiuwang 回复了问题 • 2 人关注 • 2021-05-26 20:50 • 来自相关话题

1 回复
1 回复

上传文件文件名为中文时出现异常

提问walkor 回复了问题 • 2 人关注 • 2021-05-25 15:12 • 来自相关话题

1 回复

workerman日志占用空间,导致磁盘爆满

分享朕震惊了 回复了问题 • 2 人关注 • 2021-05-25 10:42 • 来自相关话题

0 回复

在 k8s 里部署 workerman-chat

分享cloudbeer 发表了文章 • 0 个评论 • 120 次浏览 • 2021-05-25 10:20 • 来自相关话题

0 workerman 介绍 Workerman 是一个 PHP 编写的高性能的 socket 服务器通讯框架,用于快速开发各种网络应用,包括tcp的、udp的、长连接、短连接应用。 但他的官网并未提供 K8S 部署教程。下面咱们来用 ...查看全部

0 workerman 介绍


Workerman 是一个 PHP 编写的高性能的 socket 服务器通讯框架,用于快速开发各种网络应用,包括tcp的、udp的、长连接、短连接应用。


但他的官网并未提供 K8S 部署教程。下面咱们来用 K8S 部署一下 workerman-chat,他的源代码在 https://github.com/walkor/workerman-chat


本教程的包含了他的源代码(仅作为示例代码保存,代码版权属于原作者,正式部署请至 Workerman 官方下载),修改了部分代码,修改处会在下文中说明。


本文的 git 地址在 https://github.com/cloudbeer/workerman-chat-k8s


我们将按照如下的架构部署:
部署架构


docker 镜像均已经上传到 hub.docker.com,本文的脚本可以在腾讯云 TKE 中直接运行。


部署脚本如下:


kubectl apply -f ns.yaml
kubectl apply -f register.yaml
kubectl apply -f gateway.yaml
kubectl apply -f businessworker.yaml

1 编写 Dockerfile & 修改源代码


workerman 运行环境,需要安装 pcntl,代码如下。
这个 docker 包标记为:cloudbeer/workerman-base:1.0


FROM php:7.3

RUN docker-php-ext-configure pcntl --enable-pcntl \
&& docker-php-ext-install pcntl

我们使用分布式部署,所以需要修改 gateway 代码中的注册地址:127.0.0.1,但在容器中分布式部署,我们无法得知pod 的 ip,故改成动态获取 ip 的方式。
register 的 ip 也未知,但在 K8S 中,这个地址可以通过 service 发布出来,我们暂且命名这个服务为 register,gateway 和 businessworker 中注册中心的地址修改为 register 即可。


Applications/Chat/start_gateway.php,修改如下:


//....
// 分布式部署时请设置成内网ip(非127.0.0.1)
// $gateway->lanIp = '127.0.0.1';
$gateway->lanIp = getHostByName(getHostName());

//....

// 服务注册地址
// $gateway->registerAddress = '127.0.0.1:1236';
$gateway->registerAddress = 'register:1236';

//....

Applications/Chat/start_businessworker.php,修改如下:


//....

// 服务注册地址
// $worker->registerAddress = '127.0.0.1:1236';
$worker->registerAddress = 'register:1236';

//....

打包代码(别忘记 composer install 一下先):


FROM cloudbeer/workerman-base:1.0
RUN mkdir /app
COPY ./workerman-chat /app

2 部署 register


apiVersion: apps/v1
kind: Deployment
metadata:
name: workerman-chat-register
namespace: workerman
labels:
app: workerman-chat-register
spec:
replicas: 1
selector:
matchLabels:
app: workerman-chat-register
template:
metadata:
labels:
app: workerman-chat-register
spec:
containers:
- name: register
image: cloudbeer/workerman-code:1.0
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "500m"
ports:
- containerPort: 1236
protocol: TCP
command: [php, /app/Applications/Chat/start_register.php, start]
---
apiVersion: v1
kind: Service
metadata:
name: register
namespace: workerman
spec:
selector:
app: workerman-chat-register
ports:
- protocol: TCP
port: 1236
targetPort: 1236

3 部署 gateway


部署 gateway 的 pod,由于需要对外提供服务,使用了 LoadBalancer 的 service 发布服务。这里也可以创建 ingress 来发布服务。


apiVersion: apps/v1
kind: Deployment
metadata:
name: workerman-chat-gateway
namespace: workerman
labels:
app: workerman-chat-gateway
spec:
replicas: 1
selector:
matchLabels:
app: workerman-chat-gateway
template:
metadata:
labels:
app: workerman-chat-gateway
spec:
containers:
- name: gateway
image: cloudbeer/workerman-code:1.0
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "500m"
ports:
- containerPort: 7272
protocol: TCP
command: [php, /app/Applications/Chat/start_gateway.php, start]
---
apiVersion: v1
kind: Service
metadata:
name: gateway
namespace: workerman
spec:
type: LoadBalancer
selector:
app: workerman-chat-gateway
ports:
- protocol: TCP
port: 7272
targetPort: 7272

4 部署 businessworker


businessworker 在内部工作,只需要部署 pod 即可。


apiVersion: apps/v1
kind: Deployment
metadata:
name: workerman-chat-businessworker
namespace: workerman
labels:
app: workerman-chat-businessworker
spec:
replicas: 1
selector:
matchLabels:
app: workerman-chat-businessworker
template:
metadata:
labels:
app: workerman-chat-businessworker
spec:
containers:
- name: businessworker
image: cloudbeer/workerman-code:1.0
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "500m"
command: [php, /app/Applications/Chat/start_businessworker.php, start]

测试服务


workerman-chat 提供了一个 聊天室的 web 测试端。


下面我们在本地启动这个聊天室:
先修改 websocket 的目标地址,为 gateway 的 Loadbalancer 的地址(假设为 1.2.3.4),修改 Applications/Chat/Web/index.php 文件如下:



// ws = new WebSocket("ws://"+document.domain+":7272");
ws = new WebSocket("ws://1.2.3.4:7272");

本地启动:


php ./Applications/Chat/start_web.php start

打开浏览器:http://localhost:55151


多开几个聊天室,完美运行。


扩充实例


按照 workerman-chat 的文档,gateway 和 businessworker 可以扩展。register 为单实例,不能扩。


现在可以试着扩冲 businessworker 的数量:


kubectl scale --replicas=3 -f businessworker.yaml

或者直接修改 yaml 的 replicas 的数量。


扩展成功后,多开几个聊天室,就会发现 businessworker 的 pod 的日志开始接收聊天信息了。
测试的时候需要注意:只有新用户加入的时候,新扩展的 businessworker 才提供服务。


同理可扩充 gateway,gateway 的服务由 LoadBalancer 负载,经测试,聊天正常。


正式运行环境也可以使用 HPA 自动伸缩。

3 回复

frame not masked so close the connection

提问1171659744_php 回复了问题 • 2 人关注 • 2021-05-24 17:12 • 来自相关话题

1 回复

BusinessWorker的事件处理函数或者类能否指定到其它目录

回复

提问BJ001 回复了问题 • 1 人关注 • 2021-05-24 16:35 • 来自相关话题

4 回复

gatewayworker SendtoAll时,不同worker之间的客户端收不到数据

提问fhonggen 回复了问题 • 2 人关注 • 2021-05-24 11:49 • 来自相关话题

1 回复

Redis连接超时

提问walkor 回复了问题 • 2 人关注 • 2021-05-24 10:00 • 来自相关话题

1 回复

Workerman Timer 怎么异步执行多个任务

提问lscho 回复了问题 • 2 人关注 • 2021-05-23 20:42 • 来自相关话题

2 回复

nginx反向代理webman出现502错误 upstream prematurely closed

分享supereric 发表了文章 • 2 个评论 • 177 次浏览 • 2021-05-22 13:47 • 来自相关话题

nginx反向代理webman出现502错误 nginx 错误 2021/05/21 23:21:46 [error] 75037#0: *234 upstream prematurely closed connecti ...查看全部

nginx反向代理webman出现502错误


nginx 错误



2021/05/21 23:21:46 [error] 75037#0: *234 upstream prematurely closed connection while reading response header from upstream, client: 172.16.253.1, server: webman.cc, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/";, host: "webman.cc"



nginx location配置为


location /
{
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
add_header Cache-Control no-cache;
expires 12h;
}

将配置项


proxy_set_header Connection "Upgrade";

修改为


proxy_set_header Connection "Keep-Alive";

后问题解决。ws连接正常
和文档中不太一样有人可以解释一下问题吗

2 回复

webman要怎么部署上线

提问weijer 回复了问题 • 3 人关注 • 2021-05-22 10:48 • 来自相关话题

0 回复

控制台输出中文部分乱码,如何解决

回复

提问小糊涂神 发起了问题 • 1 人关注 • 2021-05-21 21:46 • 来自相关话题

2 回复

webman Redis消息队列组件 redis-queue 大批量失败

提问shixiaofei 回复了问题 • 2 人关注 • 2021-05-21 17:47 • 来自相关话题

3 回复

小白入坑workerman,第一次弄这东西

提问lunzi 回复了问题 • 4 人关注 • 2021-05-21 16:58 • 来自相关话题

1 回复

如何设置代理?

提问lunzi 回复了问题 • 2 人关注 • 2021-05-21 16:35 • 来自相关话题

0 回复

model模型获取表字段类型

回复

提问cai584887013 发起了问题 • 1 人关注 • 2021-05-21 14:15 • 来自相关话题

2 回复

关于定时跑数据的问题

提问phpxiaoxu 回复了问题 • 2 人关注 • 2021-05-20 20:58 • 来自相关话题

6 回复

Can not connect to tcp://127.0.0.1:1236 Connection refused

提问lunzi 回复了问题 • 4 人关注 • 2021-05-20 15:57 • 来自相关话题

1 回复

php7.3禁用函数pcntl_wait导致workman服务启动占用大量CPU是什么原理

提问智佳思远 回复了问题 • 2 人关注 • 2021-05-19 21:38 • 来自相关话题