Swoole中多端口推送、日志记录、负载均衡
多端口推送
聊天室为一个终端ws://localhost:8812
直播员实时发送数据为另一个终端ws://localhost:8812
两者push数据到终端进行推送
把对终端的连接写在js文件中,引入页面,使得页面与服务器保持长连接。
为了同时使用两个终端进行数据实时推送,服务器需要开启两个端口
一个连接对象,开启两个端口
$_POST[‘http_server’]-> ports[1] //端口从0开始算起
//开启的端口数从0开始排序,遍历的元素为单个连接的fd
foreach($_POST['http_server']->ports[1]->connections as $fd) {
$_POST['http_server']->push($fd, json_encode($data));
}
//fd为顺序序列,不可重复,多端口公用序列,用fd可识别出是哪个端口的终端
想要使用connections迭代器需要重新编译swoole
安装pcre之后,安装openssl等环境 此处安装的是pcre,不是pcre2
重新编译./configure –with-php-config=/… --enable-openssl --enable-http2 --enable-async-redis
sudo ./configure \
--with-php-config=/usr/local/php/bin/php-config \
--enable-openssl \
--enable-http2 \
--enable-async-redis \
--enable-sockets \
--enable-mysqlnd
对某服务端口进行实时监控并输出或记录
//希尔脚本
$shell = "netstat -anp 2>/dev/null | grep ".self::PORT . " | grep LISTEN | wc -1";
//使用定时器监控,两秒一次
swoole_timer_tick(2000, function($timer_id) {
(new Server())->port();
echo "time-start".PHP_EOL;
});
可以把内容不输出到终端,写在文件中
nohup /home/work/hdtocs/../php /home/work/…/server.php > /home/work/../a.txt &
命令行这样执行则会持续监控并把信息写入a.txt
负载均衡
nginx安装
登录官网:http://nginx.org/ 下载压缩包
解压
tar -zxvf [xxx]
使用./configure --help 查看需要哪些配置
./configure --prefix=/home/work/study/soft/nginx --sbin-path=/home/work/study/soft/nginx/sbin/nginx --conf-path=/home/work/study/soft/nginx/config/nginx.conf --error-log-path=/home/work/study/soft/nginx/logs/error.log --pid-path=/home/work/study/soft/nginx/logs/nginx.pid --http-log-path=/home/work/study/soft/nginx/logs/access.log
make -j
make install
安装过程中可能出现pcre的问题
安装pcre-devel解决问题
yum -y install pcre-devel
遇见openssl 问题
yum -y install openssl openssl-devel
安装完成后需要修改配置文件nginx.conf
开启pid
根据个人情况开启日志
启动nginx
./sbin/nginx
通过nginx访问项目下面的静态页面
修改nginx.conf文件的默认访问目录
修改后需要在conf头部加入(如下)
user root;
设置nginx服务和swoole服务器的转发
当请求的页面在nginx服务器不存在时,转发到swoole服务器php逻辑,返回结果给nginx,nginx返回给用户
在nginx.conf文件下配置
请求文件不存在时,转发swoole服务器
PS:if后必须有一个空格,语句必须分号结尾
普通模式的配置需要使用正则进行判断s=…
把处理逻辑放在两台以上服务器,负载均衡
分流访问,weight=2, weight=2 均衡负载
负载均衡demo:
把swoole服务器代码拷贝一份,开启不同端口,修改控制器输出内容。
weight=2;
weight=2;
代表两台服务器负载相同,2:2
访问同个页面刷新输出内容不同