一:getwayWorker是什么?【仔细理解】
GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等
GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理,BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。
GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。
二:getwayWorker与Workerman的关系【仔细理解】
Workerman是一个纯粹的socket类库,使用Workerman可以开发所有的网络应用,Tcp也好,Udp也罢,即可以开发短连接的接口服务,也可以开发长连接的socket聊天服务器。
如果你只专注于开发长连接的聊天服务器,那么,getwayWorker就是最好的选择。GatewayWorker是基于Workerman开发的一个TCP长连接框架,实现了单发、群送、广播等长连接必用的接口。GatewayWorker框架实现了Gateway Worker进程模型,天然支持分布式多服务器部署,扩容缩容非常方便,能够应对海量并发连接。可以说GatewayWorker是基于Workerman实现的一个更完善的专门用于实现TCP长连接的项目框架。
Linux系统下操作步骤:
1:点击链接下载GatewayWorker:https://www.workerman.net/download/GatewayWorker.zip
2:将压缩包上传至linux服务器,运行命令行 unzip GatewayWorker.zip 将压缩包解压。
3:开放linux服务器端口,比如开放8083
4:修改服务器文件/Applications/YourApp/start_gateway.php中的new Gateway时的端口号,如果使用websocket协议的话,也需要将协议改为websocket。
5:打开终端,切换到项目目录下,运行命令php start.php start启动服务。
如果终端显示
这时,打开服务器上的php.ini 找到disable_functions,把上面的方法名删除后,重启php即可。
以宝塔面板为例:
成功启动后的画面:
6:打开websocket在线测试地址,将websocket地址:端口 填写到连接输入框内,注意,端口要是自己需要访问的端口,此处的8083只是举例。
点击连接按钮。
如果连接成功的话,对话框会显示下面的信息
输入框中输入信息,点击发送,会话框就会显示发送的信息了。
后续的服务端功能开发,主要是在/Applications/YourApp/Events.php中。
详细的说明还是要参考官方文档:gateway-worker 手册
作者写的非常详细,多看多想,会理解的更深刻、
如果程序需要使用redis的话,可以参考下面的说明:
1:服务器需要安装php redis扩展。
首先使用php -m确认是否已经安装了php redis扩展。
如果没有安装的话,可以参考下面的这个文档来安装。
安装php redis扩展https://www.jb51.net/article/232165.htm
2:在/Applications/YourApp/Events.php中看看有没有onWorkerStart()方法,如果没有的话,需要把这个方法写上,参考代码如下:
- public static function onWorkerStart($businessWorker){
- //echo "WorkerStart\n";
-
-
- }
3:如果是连接本服务器redis服务的话,直接在onWorkerStart()方法中写redis的连接方法:
- global $redis;
- $redis = new redis();
- $redis -> connect('127.0.0.1',6379); //注意确认端口是否正确
- //$redis ->auth('改为自己的密码'); 如果redis设置了密码,将此代码注释放开并改为正确的redis密码
如果是连接其他服务器的redis服务的话,首先要确保其他redis服务器的端口开启远程访问,并且允许这个ip访问【查看redis.conf文件的bind是否限制了127.0.0.1,改为本gatewayWorker服务器的ip地址并重启redis服务】
onWorkerStart()方法中这样写:
- global $redis;
- $redis = new redis();
- $redis -> connect('redis服务器ip地址',6379); //根据自己需求更改IP地址和端口号
- $redis ->auth('redis密码'); //根据自己需要更改密码,如果不需要密码,可注释该行
如果在其他方法中使用redis的话,需要这样写:
- public static function onMessage($client_id, $message) {
-
- // 向所有人发送
- Gateway::sendToAll("$client_id 发来消息: $message");
-
- //向当前用户发送
- Gateway::sendToClient($client_id, "服务端单独给的消息 $client_id");
-
- global $redis;
-
- $level = $redis -> get('level');
-
- echo $level;
- }
如果同时在线人数超过1000人的话,getwayWorker服务器需要优化linux内核,同时需要安装event扩展。
centos系统
1、安装event扩展依赖的libevent-devel包,命令行运行
- yum install libevent-devel -y
- # 如果无法安装,尝试使用下面的命令
- # yum install libevent2-devel -y
2、安装event扩展,命令行运行
(event扩展要求PHP>=5.4)
pecl install event
注意提示:Include libevent OpenSSL support [yes] :
时输入no
回车,注意提示:PHP Namespace for all Event classes :
时输入yes
,其它直接敲回车就行
3、运行php --ini
找到并打开php.ini文件,在最后一行加入如下配置
extension=event.so
debian/ubuntu系统安装
1、安装event扩展依赖的libevent-dev包,命令行运行
- apt-get install libevent-dev -y
- # 如果无法安装,请尝试以下命令
- # apt-get install libevent2-dev -y
2、安装event扩展,命令行运行
pecl install event
注意提示:Include libevent OpenSSL support [yes] :
时输入no
回车,注意提示:PHP Namespace for all Event classes :
时输入yes
,其它直接敲回车就行
3、运行php --ini
找到并打开php.ini文件,在最后一行加入如下配置
extension=event.so
Linux内核优化请参考下面链接:
https://www.workerman.net/doc/workerman/appendices/kernel-optimization.html