workman
workman安装:
环境安装:
检测依赖环境是否安装 rpm -qa | grep “软件或者包的名字”或者 yum list installed
eg:
rpm -qa | grep libevent-devel
必须扩展:pcntl(pcntl扩展可以支持php的多线程操作(仅限linux系统))、posix
可选扩展:event(php7)或者 libevent(php5) 选其中一个 且这两个扩展依赖libevent-devel扩展
一键环境全装:
#此步骤包含了安装php-cli主程序以及pcntl、posix、libevent库及git程序
yum install php-cli php-process git gcc php-devel php-pear libevent-devel -y
单独安装:
检测:扩展是否安装:curl -Ss http://www.workerman.net/check.php | php
#省略安装 pcntl、posix 的步骤 #安装event扩展的依赖库 yum install libevent-devel -y #下载并安装event扩展 wget http://pecl.php.net/get/event-2.5.3.tgz tar -zxvf event-2.5.3.tgz cd event-2.5.3 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make make install
#全路径 /usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/event.so #php.ini中启用event扩展(下面路径不对的话换成上面的全路径) echo extension=event.so > /usr/local/php/etc/php.ini
环境安装完毕,接下来安装workerman框架:
git clone https://github.com/walkor/Workerman
或者直接将文件拷贝到你想要的位置
基于php多进程以及libevent事件轮询库。不依赖php-fpm、nginx或者apache等这些容器便可以独立运行
Windows 将workerman下载下来当做vendor第三方插件一样直接使用
<本机ip>可以为0.0.0.0
表示监听本机所有网卡,包括内网ip和外网ip及本地回环127.0.0.1
<本机ip>如果以为127.0.0.1
表示监听本地回环,只能本机访问,外部无法访问
<本机ip>如果为内网ip,类似192.168.xx.xx
,表示只监听内网ip,则外网用户无法访问
<本机ip>设置的值不属于本机ip则无法执行监听,并且提示Cannot assign requested address
错误
注意:www/test 对应的是 www.demo.com 它的hosts设置的ip为127.0.0.1(监听本地回环)
例子1:http服务:www/test/httpServer.php
<?php use Workerman\Worker; require_once dirname(__FILE__).'/vendor/Workerman/Autoloader.php'; // 创建一个Worker监听2345端口,使用http协议通讯 $http_worker = new Worker("http://www.demo.com:2345"); // 启动4个进程对外提供服务 $http_worker->count = 4; // 接收到浏览器发送的数据时回复hello world给浏览器 $http_worker->onMessage = function($connection, $data) { // 向浏览器发送hello world $connection->send('hello world'); }; Worker::runAll();
打开终端 键入文件所在目录 输入 php httpServer.php start -d 回车就建立http服务器了(无需开启apache或者nginx) 注意修改了这些服务器文件必须 php httpServer.php restart
浏览器访问www.demo.com:2345 或者127.0.0.1:2345 (浏览器显示hello world)
websocket:www/test/websocketServer.php
<?php use Workerman\Worker; require_once dirname(__FILE__).'/vendor/Workerman/Autoloader.php'; // 创建一个Worker监听2345端口,使用http协议通讯 $ws_worker = new Worker("websocket://0.0.0.0:2222"); // 启动4个进程对外提供服务 $ws_worker->count = 4; // 接收到浏览器发送的数据时回复hello加上浏览器发送的数据拼接一起发送给浏览器 $ws_worker->onMessage = function($connection, $data) { // 向浏览器发送hello world $connection->send('hello'.$data); }; Worker::runAll();
打开终端 键入文件所在目录 输入 php websocketServer.php start -d 回车就建立http服务器了(无需开启apache或者nginx) 注意修改了这些服务器文件必须 php httpServer.php restart
websoket页 index.php :怎么访问他呢打开apache:访问www.demo.com:80
<html> <head></head> <body> <script type="text/javascript"> var ws = new WebSocket("ws://www.demo.com:2222");//连接127.0.0.1:222 ws.onopen=function(){ ws.send('world'); } ws.onmessage=function(e){ console.log(e.data);//helloworld } </script> </body </html>
<本机ip>可以为0.0.0.0
表示监听本机所有网卡,包括内网ip和外网ip及本地回环127.0.0.1
<本机ip>如果以为127.0.0.1
表示监听本地回环,只能本机访问,外部无法访问
<本机ip>如果为内网ip,类似192.168.xx.xx
,表示只监听内网ip,则外网用户无法访问
<本机ip>设置的值不属于本机ip则无法执行监听,并且提示Cannot assign requested address
错误
使用Worker::$pidFile = '/var/run/workerman.pid';改变位置时,当他所在服务器启后,然后注释它之后在终端是杀不掉的,因为找不到pid路径了
所以要先杀掉它启动的服务然后在干别的哦
Worker:onError()由以下几种结果触发
mysql代理: 实现 mysql -h127.0.0.1 -P4406 -uroot -p 连接到端口为3306的mysql
凹
自定义协议
协议交互流程
1客户端发送写个数据包给服务端,服务端收到数据调用协议的input方法返回长度值$length给workerman框架
2得到这个$length值后就会冲反冲区截取出$length长度的数据(即分包)并调用协议的decode方法解包,解包后的数据为$data
3解包后的workerman将数据$data以回调onMesage($connection,$data)的形式传递给业务
4.服务端给客户端发送数据时, workerman会自动利用协议的encode方法将$buffer打包后发送给客户端
yum install php-cli php-process git gcc php-devel php-pear libevent-devel -y
基于workerman的GatewayWorker框架
下载:
composer require workerman/gateway-woker 或者 git clone https://github.com/walkor/GatewayWorker
工作原理
分布式部署
创建wss服务(与https一样 参考)