模拟workerman的运行,在accept流程时卡住

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 830 次浏览 • 2016-06-07 08:54 • 来自相关话题

单用workerman,如何实现gateway的心跳?

提问walkor 回复了问题 • 2 人关注 • 3 个回复 • 1706 次浏览 • 2016-06-05 16:39 • 来自相关话题

请问多个定时器的执行顺序问题

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1231 次浏览 • 2016-06-04 23:01 • 来自相关话题

关于ip和域名的问题

提问jeremyyulang 回复了问题 • 2 人关注 • 2 个回复 • 817 次浏览 • 2016-06-04 22:33 • 来自相关话题

ajax调用一个方法,该方法里面调用Gateway::sendToClient

提问ivan 回复了问题 • 3 人关注 • 3 个回复 • 1232 次浏览 • 2016-06-04 15:43 • 来自相关话题

定时器中的逻辑代码修改后,执行reload后新代码不生效

提问匿名用户 回复了问题 • 3 人关注 • 5 个回复 • 1296 次浏览 • 2016-06-03 16:31 • 来自相关话题

TcpConnection如何做客户端主动连Workerman?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 2152 次浏览 • 2016-06-02 20:27 • 来自相关话题

平滑重启问题?

提问wuchuguang 回复了问题 • 2 人关注 • 2 个回复 • 1420 次浏览 • 2016-06-02 14:42 • 来自相关话题

GlobalData Server在reload的时候也会被重启?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 665 次浏览 • 2016-06-02 14:39 • 来自相关话题

看了平滑重启原理和源码,有一些疑惑

提问walkor 回复了问题 • 2 人关注 • 2 个回复 • 797 次浏览 • 2016-06-02 11:21 • 来自相关话题

也来说说TP与Workerman的集成

提问sun2920989 发表了文章 • 6 个评论 • 3320 次浏览 • 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

AngluarJS与workerman的兼容问题

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 823 次浏览 • 2016-06-01 22:28 • 来自相关话题

和其他框架整合的疑惑

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1015 次浏览 • 2016-06-01 22:15 • 来自相关话题

workerman作为webserver是不是稳定性不够好?在里面整合了smarty老是报错

提问3p大法好 回复了问题 • 4 人关注 • 4 个回复 • 1990 次浏览 • 2016-06-01 19:07 • 来自相关话题

workerman 能够直接连接本地的mysql吗?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 943 次浏览 • 2016-06-01 11:21 • 来自相关话题

不同的worker进程 能共用一个超全局的变量对像存取数据么?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1112 次浏览 • 2016-05-31 17:12 • 来自相关话题

html5 websocket多页面共享

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

php模式下 运行start.php 报错

提问walkor 回复了问题 • 2 人关注 • 2 个回复 • 1780 次浏览 • 2016-05-31 17:06 • 来自相关话题

GateWayworker 内存占用大

提问walkor 回复了问题 • 3 人关注 • 1 个回复 • 1318 次浏览 • 2016-05-30 18:55 • 来自相关话题

请问workerman的websocket有最大连接数限制吗?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 2236 次浏览 • 2016-05-30 18:52 • 来自相关话题

关于删除Timer的问题

提问3p大法好 回复了问题 • 2 人关注 • 2 个回复 • 1127 次浏览 • 2016-05-28 23:52 • 来自相关话题

自定义文本协议,服务端丢消息

提问walkor 回复了问题 • 2 人关注 • 4 个回复 • 878 次浏览 • 2016-05-28 19:48 • 来自相关话题

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

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

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

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

g.png


kefu.png


c.png

做队列任务,在onWorkerStart里使用while,会影响服务器性能么

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1229 次浏览 • 2016-05-27 16:53 • 来自相关话题

我在网页端 JS连接 WebSocket 总是失败

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 3731 次浏览 • 2016-05-27 16:50 • 来自相关话题

通过clinet_id获取绑定的uid

提问walkor 回复了问题 • 1 人关注 • 1 个回复 • 555 次浏览 • 2016-05-26 16:49 • 来自相关话题

如何绑定uid

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

socket长链接问题

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 821 次浏览 • 2016-05-26 09:35 • 来自相关话题

创建socket客户端连接,收不到服务端消息,请老大指点。。。

提问walkor 回复了问题 • 3 人关注 • 5 个回复 • 4704 次浏览 • 2016-05-25 16:27 • 来自相关话题

workerman和thinkphp完美结合使用源码

提问心动不已 发表了文章 • 5 个评论 • 8930 次浏览 • 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

如何只使用wokerman进行全员广播

提问walkor 回复了问题 • 2 人关注 • 3 个回复 • 1054 次浏览 • 2016-05-24 14:08 • 来自相关话题

关于Gateway/worker多协议支持的问题

提问walkor 回复了问题 • 2 人关注 • 3 个回复 • 1211 次浏览 • 2016-05-23 17:20 • 来自相关话题

请问workerman-chat如何缓存最近几条聊天记录

提问latin 回复了问题 • 2 人关注 • 1 个回复 • 854 次浏览 • 2016-05-23 16:10 • 来自相关话题

上传文件使用异步AsyncTcpConnection的TextTransfer协议,成功上传后events.php收不到异步进程的回复信息?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1184 次浏览 • 2016-05-22 16:25 • 来自相关话题

想使用workerman做个断点续传功能,有实例吗?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 950 次浏览 • 2016-05-22 10:53 • 来自相关话题

网站从http切换到https后,nginx该如何去加代理

提问walkor 回复了问题 • 2 人关注 • 3 个回复 • 1785 次浏览 • 2016-05-21 22:33 • 来自相关话题

chat聊天室实例刷新页面出现两个帐号同时在线

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1526 次浏览 • 2016-05-21 17:31 • 来自相关话题

如何用gateway做文件下载服务器?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 723 次浏览 • 2016-05-21 17:21 • 来自相关话题

问些小白问题!

提问hmmm 回复了问题 • 3 人关注 • 2 个回复 • 755 次浏览 • 2016-05-20 19:09 • 来自相关话题

workerman作为webserver的长短连接问题

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1053 次浏览 • 2016-05-20 18:21 • 来自相关话题