社区提问规范

回复

公告walkor 发起了问题 • 1 人关注 • 0 个回复 • 85 次浏览 • 2018-11-16 12:22 • 来自相关话题

定时长任务,内存资源回收问题,望不吝赐教

提问walkor 回复了问题 • 2 人关注 • 2 个回复 • 168 次浏览 • 2018-11-02 09:35 • 来自相关话题

链接数还是上不去?

提问walkor 回复了问题 • 2 人关注 • 9 个回复 • 149 次浏览 • 2018-10-30 14:11 • 来自相关话题

物联网云打印机-基于workerman

案例云打印 发表了文章 • 0 个评论 • 156 次浏览 • 2018-10-27 22:33 • 来自相关话题

易联云依托云计算服务器,打造一套跨地域跨网络的一个打印平台。易联云较于传统打印机不同, 传统打印机需要依赖设备驱动、有线、专业的人负责打印,而易联云云打印基于workerman(gatewayWorker)开发的一套服务端打印程序,后台管理提供打印机一系列数据 ...查看全部
易联云依托云计算服务器,打造一套跨地域跨网络的一个打印平台。易联云较于传统打印机不同, 传统打印机需要依赖设备驱动、有线、专业的人负责打印,而易联云云打印基于workerman(gatewayWorker)开发的一套服务端打印程序,后台管理提供打印机一系列数据显示,包括打印机状态、打印机信息、打印数据统计、打印订单统计、打印机温度、打印机重打、按键打印等特色功能。 对外提供接口方式打印,目前有医院、ktv、餐饮、商城、酒店、加油站等场景得到应用,包括目前最火的三大外卖平台提供打印应用,物流货运订单打印应用。
 
依托于workerman的高性能、高稳定性、高可扩展性,易联云成功研发并发布了多款云打印机,目前仅用3台云服务器便实现了近10万设备在线,日处理请求8000万。项目自2013年以来累计售出数十万台设备。

1.png
 
2.png
7478DD59-5843-45D9-92B9-12F6CA234152.png

 
相关连接
易联云官网
产品购买-京东
 
 
 
 
 
 

封装composer包,实现thinkphp、larverl、yii框架中使用(使用框架实现回调方法)

分享879042886 发表了文章 • 1 个评论 • 410 次浏览 • 2018-08-08 17:23 • 来自相关话题

内有demo thinkphp、larverl、yii框架使用worker-socket 可以查看我写的即时通讯案例 佳萌驿站 然后点击QQ登录 完美解决在 event 里面 ,onmessage 里面如何 ...查看全部
内有demo thinkphp、larverl、yii框架使用worker-socket

可以查看我写的即时通讯案例 佳萌驿站 然后点击QQ登录



完美解决在 event 里面 ,onmessage 里面如何 嵌入 thinkphp,使用框架实现回调方法


1.安装
composer require tinymeng/worker-socket dev-master

2.业务逻辑
在项目 /application/index/controller 下创建文件Events.php
首先创建控制器类并继承 tinymeng\worker\Server,然后设置属性和添加回调方法

2.1 ThinkPhp框架示例如下:
<?php
/**
* Name: Events.php.
* Author: JiaMeng <666@majiameng.com>
* Description: websocket callback
*/
namespace app\index\controller;

use tinymeng\worker\Server;
use GatewayWorker\Lib\Gateway;

class Events extends Server{
/**
* @var string Socket connect address
*/
protected $socket = 'websocket://0.0.0.0:1314';
/**
* @var string The current class of namespace
*/
protected $eventHandler = 'app\index\controller\Events';

/**
* Description: 当客户端连接时时触发
* Author: JiaMeng <666@majiameng.com>
* @param $client_id
*/
public static function onConnect($client_id){
echo 'client_id : '.$client_id. ', connect ' .PHP_EOL;
}

/**
* Description: 当客户端发来消息时触发
* Author: JiaMeng <666@majiameng.com>
* @param int $client_id 连接id
* @param string $data 具体消息
*/
public static function onMessage($client_id, $data) {
echo 'client : '.$client_id. ',message data :'.$data .PHP_EOL;
}

/**
* Description: 当客户端断开连接时触发
* Author: JiaMeng <666@majiameng.com>
* @param int $client_id 连接id
*/
public static function onClose($client_id) {
echo 'client_id : '.$client_id .' close '.PHP_EOL;
}

}


3.配置thinkphp的启动文件然后来启动 workman 这样回调就会主动回调回写的控制中了,可以试一试哦
4.


支持workerman所有的回调方法定义(回调方法必须是public static类型)

关于processTimeout和processTimeoutHandler的设置问题

提问粥真清 回复了问题 • 2 人关注 • 10 个回复 • 503 次浏览 • 2018-07-31 22:54 • 来自相关话题

HTTP协议下的IO阻塞任务,如何保证请求均匀分配到进程

分享whyme 发表了文章 • 2 个评论 • 450 次浏览 • 2018-05-31 16:38 • 来自相关话题

比如以HTTP协议创建了5个进程,然后每个进程里的业务执行时间是2秒。 然后并发4个用户,16次请求ab -c 4 -n 16 'http://127.0.0.1:8080/' 结果请求并没有均匀分配到进程,某个进程对某个 ...查看全部
比如以HTTP协议创建了5个进程,然后每个进程里的业务执行时间是2秒。

然后并发4个用户,16次请求
ab -c 4 -n 16 'http://127.0.0.1:8080/'

结果请求并没有均匀分配到进程,某个进程对某个请求进行了阻塞
2018-05-31 15:48:22.6796 service_log 'executeTime:2.0680978298187'
2018-05-31 15:48:22.6797 service_log 'executeTime:2.0688819885254'
2018-05-31 15:48:22.6799 service_log 'executeTime:2.069078207016'
2018-05-31 15:48:22.6801 service_log 'executeTime:2.0692131519318'

2018-05-31 15:48:24.6901 service_log 'executeTime:2.0080099105835'
2018-05-31 15:48:24.6901 service_log 'executeTime:2.0079879760742'

2018-05-31 15:48:26.6998 service_log 'executeTime:2.0084669589996'
2018-05-31 15:48:26.6998 service_log 'executeTime:2.0076689720154'
2018-05-31 15:48:26.6998 service_log 'executeTime:2.0074841976166'
2018-05-31 15:48:26.6999 service_log 'executeTime:2.0084929466248'

2018-05-31 15:48:28.7072 service_log 'executeTime:2.0056090354919'
2018-05-31 15:48:28.7073 service_log 'executeTime:2.0057229995728'
2018-05-31 15:48:28.7073 service_log 'executeTime:2.0057458877563'

2018-05-31 15:48:30.7168 service_log 'executeTime:2.0076150894165'
2018-05-31 15:48:30.7171 service_log 'executeTime:2.0088679790497'
2018-05-31 15:48:30.7173 service_log 'executeTime:2.0084898471832'


可以通过在建立连接后暂停请求,结束后关闭请求的方式,避免多个请求阻塞到一个进程中执行:
$worker->onConnect = function(TcpConnection $connection)use($worker) {
$worker->pauseAccept(); // 暂停接收请求

// 接收消息回调
$connection->onMessage = function (TcpConnection $connection, $data) {
// 耗时代码
$connection->close('success‘); // 关闭连接
};
};
$worker->onClose = function(TcpConnection $connection)use($worker) {
$worker->resumeAccept(); // 恢复接收请求
};


最后就得到了如下结果:
2018-05-31 16:34:22.2053 service_log 'executeTime:2.058121919632'
2018-05-31 16:34:22.2053 service_log 'executeTime:2.0567870140076'
2018-05-31 16:34:22.3065 service_log 'executeTime:2.1597728729248'
2018-05-31 16:34:22.3065 service_log 'executeTime:2.1576390266418'

2018-05-31 16:34:24.3266 service_log 'executeTime:2.1183500289917'
2018-05-31 16:34:24.3267 service_log 'executeTime:2.1188020706177'
2018-05-31 16:34:24.4269 service_log 'executeTime:2.1188299655914'
2018-05-31 16:34:24.4272 service_log 'executeTime:2.118989944458'

2018-05-31 16:34:26.4402 service_log 'executeTime:2.1116380691528'
2018-05-31 16:34:26.4402 service_log 'executeTime:2.1118400096893'
2018-05-31 16:34:26.5402 service_log 'executeTime:2.1115860939026'
2018-05-31 16:34:26.5402 service_log 'executeTime:2.1114778518677'

2018-05-31 16:34:28.4544 service_log 'executeTime:2.0095458030701'
2018-05-31 16:34:28.5551 service_log 'executeTime:2.1137058734894'
2018-05-31 16:34:28.6556 service_log 'executeTime:2.1138899326324'
2018-05-31 16:34:28.6556 service_log 'executeTime:2.1138758659363'

以上是单一的HTTP协议的worker模型,之后我试过用HTTP协议的worker接收请求,然后异步转发给TCP协议的worker进行处理,发现如果一次性发起多个请求时,TCP协议的worker也会出现类似上面的情况,然后通过上面的方法,也很完美的解决了这个问题。

最后我觉得pauseAccept()、resumeAccept()应用场景很多啊,比如生存消费者模型中,消费者IO阻塞等待任务,又比如对时间点要求较高的爬虫任务,能尽量的均匀分配请求到进程,进而减少时间差。

官方文档目前还没有相应描述,我还是好不容易找了一篇文章中的关键字pauseAccept,然后搜索源码发现的。。。这真是两个神奇的方法,希望官方能在后面补充一下,对于我这类的小白就帮助大了,哈哈哈

TCP 异常断开

提问walkor 回复了问题 • 3 人关注 • 1 个回复 • 676 次浏览 • 2018-05-19 16:15 • 来自相关话题

欢迎提交自己workerman相关的项目

提问blogdaren 回复了问题 • 5 人关注 • 4 个回复 • 948 次浏览 • 2018-10-18 15:35 • 来自相关话题

小程序与GatewayWorker建立连接及 apache 配置 https 转发

分享默然 发表了文章 • 1 个评论 • 1045 次浏览 • 2018-03-08 09:30 • 来自相关话题

1、apache 加载 proxy_module ,proxy_wstunnel_module 模块 2、apache 配置 ssl # Proxy Config SSLProxyEngine on #监听的路径和转发的路径 ...查看全部
1、apache 加载 proxy_module ,proxy_wstunnel_module 模块
2、apache 配置 ssl 
# Proxy Config
SSLProxyEngine on
#监听的路径和转发的路径,需要输入https://和最后面的/
ProxyRequests Off
ProxyPass /wss ws://0.0.0.0:8585
ProxyPassReverse /wss ws://0.0.0.0:8585

3、小程序代码
var that = this;
wx.connectSocket({
url: "wss://www.xxx.com/wss"
});

4、GatewayWorker 代码
$gateway = new Gateway('websocket://0.0.0.0:8585', $context);

原文链接:]微信小程序 - websocket wss[/url]

关于内核参数设置:net.ipv4.tcp_max_tw_buckets = 20000

提问softshare 回复了问题 • 2 人关注 • 2 个回复 • 2442 次浏览 • 2018-10-08 23:23 • 来自相关话题

写了一个基于 workerman 的小型 HTTP 框架 WorkerA

分享wazsmwazsm 发表了文章 • 15 个评论 • 1652 次浏览 • 2017-09-27 10:17 • 来自相关话题

2018-07-29 更新 最小版本升级 1.1.0 ==> 1.1.1 完善 IOC 容器,解决 IOC 容器只能依赖注入一层的问题。 修复平滑启动不能响应配置修改的问题。 ...查看全部
2018-07-29 更新

最小版本升级 1.1.0 ==> 1.1.1

完善 IOC 容器,解决 IOC 容器只能依赖注入一层的问题。

修复平滑启动不能响应配置修改的问题。

修复动态路由缓存内存泄漏导致进程重启的问题,使用 LRU 算法控制了缓存的大小。


2018-07-15 更新

WorkerA 发布了 1.1 版本,新增了中间件、动态路由、异常 Handler 等功能。

修复若干 bug,改善了很多不足。

编写了框架的文档:文档地址

2017-10-18 更新
添加了 redis 支持

=============

接触 workerman 一个多月,让我重新认识了 PHP。很佩服 workerman 的性能和稳定性。

之前有用 laravel \ lumen 做一个接口的项目,虽然 laravel 的开发很方便,但是由于服务器配置和传统 wnmp wamp 模型的限制,QPS 小的可怜。于是用 workerman 写一个小型的 HTTP 框架的想法就出来了。

WorkerA 目前只写了一个月不到,第一版发布,实现了一些基础功能。
使用自动依赖注入
提供 mysql 驱动、支持断线重连,跑在进程单例模式中
提供单例模式,可以注册需要的类为单例
支持 gizp deflate 压缩传输

个人喜欢 laravel 的查询构造器和路由的风格,于是将路由和查询构造器都写成了 laravel 风,你可以像 laravel 一样的方式写路由和查数据库。

WorkerA 没有 view 层,更适合做接口的项目,当然目前框架没有提供 JWT 等验证功能,要完成一个标准的 webapi ,你需要自己写一些东西。不过有自动依赖注入的功能,扩展也不算难题。

在此谢谢 workerman 的作者,虽然只是用了 workerman 功能的一小部分,但是依然解决了我自己的很多业务上的难题。

Github 地址 :https://github.com/wazsmwazsm/WorkerA
框架核心部分地址 :https://github.com/wazsmwazsm/WorkerF

GatewayWorker

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1266 次浏览 • 2017-07-29 15:24 • 来自相关话题

关于gatewayworker做游戏服务器的一些问题

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 769 次浏览 • 2017-06-08 15:35 • 来自相关话题

关于TcpConnection的send函数

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 716 次浏览 • 2017-04-12 16:05 • 来自相关话题

gateway连接数不平均

提问walkor 回复了问题 • 5 人关注 • 1 个回复 • 1013 次浏览 • 2017-04-05 10:34 • 来自相关话题

哪位大神能讲解一下子进程退出 exit() 其中的 0 和 250 什么意思

提问NickBai 回复了问题 • 2 人关注 • 2 个回复 • 1370 次浏览 • 2017-03-29 13:05 • 来自相关话题

长时间未操作,数据库连接出错了怎么搞?

提问walkor 回复了问题 • 3 人关注 • 1 个回复 • 987 次浏览 • 2017-03-29 11:04 • 来自相关话题

Workerman 用了WSS无法用$_SERVER['REMOTE_ADDR']取得用户IP

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1594 次浏览 • 2017-01-12 22:16 • 来自相关话题

硬件数据推送给特定手机端

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 750 次浏览 • 2016-12-15 19:55 • 来自相关话题

API实时QPS统计!PS:群内问答!

提问workermen 回复了问题 • 5 人关注 • 2 个回复 • 1991 次浏览 • 2017-11-14 13:34 • 来自相关话题

==> Workerman的Git仓库,快来Star提升人气吖 o_O <==

提问defeatlr 回复了问题 • 13 人关注 • 16 个回复 • 990 次浏览 • 2018-01-03 20:51 • 来自相关话题

心跳可不可以把当前时时的时间戳发给客户端啊

提问hmmm 回复了问题 • 4 人关注 • 2 个回复 • 706 次浏览 • 2016-11-30 17:17 • 来自相关话题

如何模拟压力测试gateway worker保持在线的能力? 能够用workman模拟?

提问yangws 回复了问题 • 9 人关注 • 7 个回复 • 2893 次浏览 • 2018-07-10 10:29 • 来自相关话题

Gateway之WSS协议的Nginx+openssl的解决方案(生产环境配置分享)

提问hmmm 回复了问题 • 8 人关注 • 4 个回复 • 926 次浏览 • 2016-10-26 20:02 • 来自相关话题

workerman-statistics下的问题

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 783 次浏览 • 2016-10-26 11:49 • 来自相关话题

workerman服务器监听端口在如何处理客户端连接,最大连接数是多少

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 879 次浏览 • 2016-10-10 23:37 • 来自相关话题

二级路由器下服务器的映射

分享edgexie 发表了文章 • 2 个评论 • 1100 次浏览 • 2016-08-30 18:00 • 来自相关话题

2016/08/30 15:58 最近在学习workerman框架,虽然也在看手册,但找到些好玩儿的会增强自己学习的主动性。所以就寻思着如何将自己制作的东西分享给朋友,也就是怎么把本地搭建的服务映射到外网。所以今天做下笔记,以便在成长路上留下一抹印 ...查看全部
2016/08/30 15:58
最近在学习workerman框架,虽然也在看手册,但找到些好玩儿的会增强自己学习的主动性。所以就寻思着如何将自己制作的东西分享给朋友,也就是怎么把本地搭建的服务映射到外网。所以今天做下笔记,以便在成长路上留下一抹印记。
我的家还算大,书房跟 客厅路由器的位置比较远,所以采用两级路由器的方式组网,用文本表示一下组网的线路结构吧。
光猫LAN口->路由器A WAN口 | 路由器A LAN口->路由器B WAN口 | 路由器B LAN口->centos服务器。其中路由器A负责拨号上网。
先来想想如果想在有internet的地方访问到本地centos服务器的访问链:

  • 通过公网地址访问到路由器A的WAN口。所以你必须保证自己家的网络运营商给你分配的是一个公网地址,随着上网用户的增减,IPv4的IP地址紧张,现在运营商的普遍做法是在用户没要求的时候给用户分配一个内网地址,如10.XXX.XXX.XXX 这样的地址。你会发现百度‘IP地址’所显示的地址和路由器A的WAN口地址不一样。这时候你需要跟运营商沟通,说你需要公网地址。
  • 如果运营商给你改成了公网地址,事情就可以进行下去了。把路由器A给路由器B分配的IP地址映射出去,插一句:路由器B的上网方式你要设置成静态获取一个路由器的IP地址。操作路由器A在管理页面里,找到功能如“虚拟服务器”或者“端口段映射”(具体看所属品牌路由器上有什么对应的功能名称),把路由器B的WAN口地址做映射,端口填写你服务器对外提供服务的端口,我开的是一个apache(端口80)和一个worker(端口2345)。路由器(tplink)映射设置如下图:
tp.png
  • 这样通过公网就可以访问到路由器B的WAN口了。接下来把路由器B下挂的服务器地址映射出去。如下图(腾达):
td.png
  • 这样就可以在浏览器中通过公网地址访问到你的服务器了。
[list=1]
[*]浏览器输入公网地址如:60.223.XX.XX ,插一句:有的用户80端口会被服务商屏蔽,如果被屏蔽请修改为一个10000以上的端口去把服务器的apache映射出去,当然这里也需要在服务器中改apache配置文件里的服务端口。[/*]
[*]在服务器上开启wokerman,start.php如下:
[/*]
[/list]<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 创建一个Worker监听2345端口,使用websocket协议通讯
$ws_worker = new Worker("websocket://0.0.0.0:2345");
$ws_worker->onConnect = function($connection)use($ws_worker){
echo $connection->id."\n";
};
function send($ws_worker,$data){
foreach($ws_worker->connections as $connection)
{
$connection->send($data);
}
}
$ws_worker->onMessage = function($connection,$data)use($ws_worker)
{
send($ws_worker,$data);
};
// 运行worker
Worker::runAll();

3.在服务器的apache服务中(默认路径:/var/www/html)上传一个index.html网页,一定要注意填写正确的地址即你的公网地址,我源码中用60.223.XX.XX表示了。源码如下:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
<style>
body{ font-size:16px; line-height:1.8; width:900px; margin:auto;padding: 60px 0}
*{ margin:0; padding:0;}
#show{
width: 200px;border: 1px solid black;margin: 10px;display: inline-block;height: 29px;
}
input{
height: 29px;line-height: 29px;padding-left: 10px;width: 200px;
}
</style>
</head>
<body>
<div>输入:<input type="text" id="content" /><button onclick="sendText()" type="submit">测试</button></div>
<div>记录:<span id="show"></span></div>
<script type="text/javascript">
//使用websocket协议
ws = new WebSocket("ws://60.223.XX.XX:2345");
ws.onopen = function(){
ws.send('即时聊天@xie');
};
ws.onmessage = function(e){
document.getElementById('show').innerHTML = e.data;
};
ws.onclose = function(e) {
alert('WebSocketClosed!');
};

//测试按钮发送文本框内容
function sendText(){
var content = document.getElementById('content').value;
if(content!=''){
ws.send(document.getElementById('content').value);
document.getElementById('content').value='';
}
};
</script>
</body>
</html>

4.打开浏览器输入公网地址,截图如下:
test1.png


test2.png


test3.png


题外话:
我为什么要这样折腾?
前几天从朋友家拿了个他一脚踹开的电脑,配置一般。我就寻思的在家自己搭建个服务器学习。就顺过来了,拿回来第一件事就是用U盘装centos无图形界面,安装还算顺利,唯一要注意的是引导程序别安装在U盘上,不然,拔了U盘centos启动不了。
有花生壳的朋友还可以在路由器A上开启DDNS,这样通过访问花生壳提供的免费域名就可以了,不用再输入那个公网地址,具体我想大家应该会操作吧,只是简单的登录一下花生壳就行。
一定要注意centos的防火墙设置,把2345和80端口开了。

我这样折腾以后,只要开着那个服务器和路由器就相当于我有了一个随时可以远程玩儿弄的服务器。

我是新手,老司机们不要笑啊。

Gateway端向客户端发送数据对数据进行encode的问题

提问24tergderg 回复了问题 • 3 人关注 • 2 个回复 • 700 次浏览 • 2016-08-31 08:39 • 来自相关话题

Workerman与Socket.IO之间的关系?

提问walkor 回复了问题 • 2 人关注 • 3 个回复 • 1851 次浏览 • 2016-08-30 18:30 • 来自相关话题

想了解下数据是如何分发到子进程的

提问walkor 回复了问题 • 4 人关注 • 3 个回复 • 1533 次浏览 • 2016-07-29 11:33 • 来自相关话题

请问一下browserquest-php项目换成GatewayWorker的形式需要怎么部署worker

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 997 次浏览 • 2016-07-19 20:34 • 来自相关话题

也来说说TP与Workerman的集成

提问sun2920989 发表了文章 • 6 个评论 • 2094 次浏览 • 2016-06-02 09:35 • 来自相关话题

最近想在TP的项目中使用Workerman,经查看一些资料发现我现在使用的方式和大家不太一样,所以发出来大家可以指点一二 突然发现无法发链接,把内容复制过来一下好了 原理 TP与Workerman集成的难处在 ...查看全部
最近想在TP的项目中使用Workerman,经查看一些资料发现我现在使用的方式和大家不太一样,所以发出来大家可以指点一二
突然发现无法发链接,把内容复制过来一下好了

原理
TP与Workerman集成的难处在于CLI模式下TP默认第一个参数为入口文件,第二个参数为控制器路径,之后为参数
Workerman默认第一个参数为文件,第二个参数在WIN下无用,Linux下为start等指令
那么问题来了,在TP中使用Workerman一般都是在控制器层,而不是新增入口文件的方式
这样的话第二个参数的用途上两个框架会产生冲突,一般的解决方式有改动Workerman源码,直接在新入口文件中使用Workerman等
但是通过观察两个项目的源码发现,Workerman是靠$argv进行参数判断,而TP则使用$_SERVER['argv']进行控制器映射
这样的话在可控的范围内可以通过讨巧的方式干涉$argv参数的形式进行集成
方式
1.下载WIN和Linux双版本的Workerman,放入ThinkPHP/Library/Vendor/目录,重命名为Workerman_for_win和Workerman_for_linux
2.在任意模块的控制器目录建立Workerman控制器基类,基类继承自TP的Controller类
3.在Workerman控制器的构造方法中判断当前环境:$os = IS_WIN ? 'win':'linux';
4.根据当前环境引入Workerman的自动加载文件:Vendor('Workerman_for_'.$os.'.Autoloader');
5.干预$argv参数内容,同时设置被挤掉的$argv[1]为常量
global $argv;
define ('ARGV1', $argv[1]);
$argv[1] = isset($argv[2])?$argv[2]:'';
$argv[2] = isset($argv[3])?$argv[3]:'';
6.调用父类构造方法:parent::__construct();
7.新建CLI模式的入口文件,同时需要使用Workerman功能的控制器继承刚才新建的类
特点
使用这种方式集成有如下优缺点:
优点:无需改动任何Workerman源码或文件名,两个项目可以互不干扰的集成
自动判断环境方便开发与部署
缺点:人工干预了$argv参数需要项目中对$argv的使用可控,或项目中只使用$_SERVER['argv']
可能会对带参数执行CLI模式的TP控制器产生一定影响,尽量启动时除控制器路径和Workerman指令外不带有其他参数
最后
Workerman是纯PHP实现的PHP socket 服务器框架,支持多种协议和毫秒级定时器等强大特性
Workerman在WIN下直接使用主进程进行服务而在Linux下使用子进程进行服务这在特定情况下会产生区别,开发时需要注意

本人的地址
http://codeape.leanote.com/post/ThinkPHP%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8

基于GatewayWorker开发的多用户多客服在线客服系统

提问dapeng 发表了文章 • 2 个评论 • 1660 次浏览 • 2016-05-27 22:18 • 来自相关话题

后端基于GatewayWorker框架,浏览器端采用websocket协议,开发的一款免费、开源、多用户、多客服在线客服系统,适合html5网站使用; 前期已完善模块:客服管理员模块,客服聊天模块,前端访客模块(手机端和pc端); 客服 ...查看全部
后端基于GatewayWorker框架,浏览器端采用websocket协议,开发的一款免费、开源、多用户、多客服在线客服系统,适合html5网站使用;
前期已完善模块:客服管理员模块,客服聊天模块,前端访客模块(手机端和pc端);
客服管理员模块已实现功能:简单人数统计,历史会话管理,客服人员管理,后台管理设置;
客服聊天模块已实现功能:当前会话管理,历史会话管理,个人信息设置;
访客模块已实现功能:发送文字、表情消息,消息提醒;

公开测试,速来拍砖
http://www.duiler.com

g.png


kefu.png


c.png

Workerman集成ThinkPHP

提问hehe 回复了问题 • 6 人关注 • 2 个回复 • 3161 次浏览 • 2018-06-28 19:15 • 来自相关话题

workerman和thinkphp完美结合使用源码

提问心动不已 发表了文章 • 4 个评论 • 4865 次浏览 • 2016-05-25 09:25 • 来自相关话题

逛论坛看到很多thinkphper在问如何将workerman集成到thinkphp中, 现在特意奉上源码,经过本人自测可以运行 下载workerman, 放入thinkphp,注意与Home平级,就把workerman当做是一个模块。 ...查看全部
逛论坛看到很多thinkphper在问如何将workerman集成到thinkphp中, 现在特意奉上源码,经过本人自测可以运行
下载workerman, 放入thinkphp,注意与Home平级,就把workerman当做是一个模块。

进入Home/Controller目录,新建WorkermanController.class.php

直接上源码,这里我是以守护进程方式运行的,调试的话,可以去掉daemonize = true 这行.

<?php
namespace Admin\Controller;
use Workerman\Worker;

class WorkermanController{

public function index(){
if(!IS_CLI){
die("access illegal");
}
require_once APP_PATH.'Workerman/Autoloader.php';

// 每个进程最多执行1000个请求
define('MAX_REQUEST', 1000);

Worker::$daemonize = true;//以守护进程运行
Worker::$pidFile = '/data/wwwlogs/CMSWorker/workerman.pid';//方便监控WorkerMan进程状态
Worker::$stdoutFile = '/data/wwwlogs/CMSWorker/stdout.log';//输出日志, 如echo,var_dump等
Worker::$logFile = '/data/wwwlogs/CMSWorker/workerman.log';//workerman自身相关的日志,包括启动、停止等,不包含任何业务日志

$worker = new Worker('text://172.16.0.10:10024');
$worker->name = 'CMSWorker';
$worker->count = 2;
//$worker->transport = 'udp';// 使用udp协议,默认TCP

$worker->onWorkerStart = function($worker){
echo "Worker starting...\n";
};
$worker->onMessage = function($connection, $data){
static $request_count = 0;// 已经处理请求数
var_dump($data);
$connection->send("hello");

/*
* 退出当前进程,主进程会立刻重新启动一个全新进程补充上来,从而完成进程重启
*/
if(++$request_count >= MAX_REQUEST){// 如果请求数达到1000
Worker::stopAll();
}
};

$worker->onBufferFull = function($connection){
echo "bufferFull and do not send again\n";
};
$worker->onBufferDrain = function($connection){
echo "buffer drain and continue send\n";
};

$worker->onWorkerStop = function($worker){
echo "Worker stopping...\n";
};

$worker->onError = function($connection, $code, $msg){
echo "error $code $msg\n";
};

// 运行worker
Worker::runAll();
}
}

修改Workerman/Worker.php源码,找到parseCommand()方法,workerman版本3.3.2的话,在586行,修改命令行检测语法:


protected static function parseCommand()
{
global $argv;
// Check argv;
$start_file = $argv[0];
if (!isset($argv[2])) {
exit("Usage: php yourfile.php Controller/Action {start|stop|restart|reload|status|kill}\n");
}

// Get command.
$command = trim($argv[2]);
$command2 = isset($argv[3]) ? $argv[3] : '';
.....
}

OK,此时大功告成。

Linux命令行下运行,注意,此处要切换到thinkphp根目录下面
/usr/local/php/bin/php index.php Workerman/index start

查看运行状态:
/usr/local/php/bin/php index.php Workerman/index status

此处命令行可以放入全局变量中,直接以php运行

网站对于代码编辑支持的不好,至少我没找到,今天刚敲出来的代码,本人自测通过~

您也可以参考我的个人网站 http://isbala.com/article/269.html

socket.io为什么不能支持同端口多进程模式?

提问walkor 回复了问题 • 3 人关注 • 1 个回复 • 1592 次浏览 • 2016-03-27 01:26 • 来自相关话题

gatewayworker phpsocketio 区别和选择

提问walkor 回复了问题 • 4 人关注 • 3 个回复 • 1560 次浏览 • 2016-03-22 18:52 • 来自相关话题

消息发送失败重发如何实现啊?和大文件断点续传怎么实现啊?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1262 次浏览 • 2016-03-05 19:07 • 来自相关话题

您好,请问能否给我们推荐一个比较适用于写GW业务逻辑的PHP框架?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1570 次浏览 • 2016-02-25 09:36 • 来自相关话题