主流框架 easyswoole swft fastd
1.面向生产环境php异步通讯框架微服务
2.官网:https://www.swoole.com http://php.net
3.支持百万并发TCP链接
4.swoole linux环境开发 php7 swoole2.1 redis
5.源码安装php7 源码安装swoole
php7源码安装 解压 configure make make install
解压
tar -xjvf name.bz2 源码包
congifure 实质是shell脚本,为进行安装的软件添加配置
$./configure --prefix=/home/work/study/soft/php // 指定目录
make
make install
执行代码
$./bin/php test.php
配置执行路径
$vi ~/.bash_profile //当前用户执行的别名
$source ~/.base_profile
//命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
源码编译坑 编译完的PHP没有php.ini文件 需要把源码包 php.ini cp到安装目录的etc文件下
查找php.ini文件位置
$php -i | grep php.ini
swoole源码安装 https://www.swoole.com
下载 git方式
$git clone https://gitee.com/swoole/swoole.git
zip方式
$unzip swoole.zip
源码安装 生成so文件
swoole解压文件没有configure文件,需要phpize生成configure文件
$/home/work/study/soft/php/bin/phpize 进入swoole文件执行 生成configure等文件
$.configure --with-php-config=/home/work/study/soft/php/bin/php-config 查找路径
$make
$make install
末尾出现:Installing shared extensions: 编译swoole.so扩展文件存放路径
php.ini 加 extension=swoole
查看开启的服务
$netstat -anp | grep 9501 TIME_WAIT:即将关闭 LISTEN:监听
LISTEN 28763/php 进程号/类型 杀死进程 $kill 28763
关闭服务 ctrl+c
TCP服务 tcp.php
set worker_num => 8 //worker进程数 cpu 1-4倍
max_request => 10000
connect //监听连接事件
$fd 客户端连接的唯一标示 从1开始自增
$reactor_id 线程ID
receive //监听数据接收事件
//查看work进程数量 ps aft | grep tcp.php(文件名)
cli测试 $telnet 127.0.0.1 9501
TCP客户端 tcp_client.php
swoole tcp php文件
$client = new swoole_client();
$client->connect();
//php cli 常量
fwrite(STDOUT,'请输入消息'); //向cli发送消息
$msg = trim(fgets(STDIN)); //获取cli输入消息
//发送消息给TCP SERVERS 服务器
$client->send($msg);
//接收来自SERVERS 的数据
$result = $client->recv();
UDP服务、UDP客户端与tcp类似 只是参数不同而已
HttpServer应用服务器 nginx代理 http_server.php
$http = new swoole_http_server();
$http->set(
'enable_static_handler' //开启静态文件
'document_root' //静态文件地址 js wbsocoket文件
);
$http->on('request',function($request,$response){}){}
$response->end();//输出浏览器,否则输出到服务器 string格式
$http->start();
测试 $curl http://127.0.0.1/:port?m=1
WebSocket服务器 基于TCP通讯 基于HTTP服务 可以支持HTTP协议
缺点:HTTP的通信只能由客户端发起
特点:建立tcp协议之上
性能开销小高效
客户端与服务端任意发送数据
WebSocket客户端 用php文件及js请求
var wsUrl = 'ws://singwa.com';
var websocket = new WebSocket(wsUrl);
websocket.open = function(evt){
websocket.send('hello-sinwa');
console.log("success");
}
console.log(ev.data);
web.onmessage = function(evt){
}
websocket.onclose = function(evt){
}
websocket.onerror = function(evt){
console.log(evt.data);
}
Swoole定时器
常规定时器 linux crontab 只能秒级别定时
swoole_timer_tick 间隔执行
swoole_timer_after 多长时间执行(异步定时器)
Swoole 异步文件IO读写
swoole_async_readfile
swoole_async_writefile
swoole使用异步redis的前置
redis官网 https://redis.io
下载 redis-4.0.8.tar.bz2
$tar -zxvf redis-4.0.8.tar.bz2
$cd redis-4.0.8
$make
$cd src
$./redis-server 启动redis程序
$./redis-cli 启动redis客户端
swoole使用异步redis的前提要编译时候安装hiredis
hiredis官网下载
$unzip hiredis-0.13.3.zip
$cd hiredis-0.13.3
$make -j
$sudo make install //权限执行
$sudo ldconfig
//重新编译swoole
swoole目录下
$./configure --with-php-config=/home/soft/php/bin/php-config --enable-async-redis //自动查找编译的hiredis
$make clean //清除之前编译产生的文件
$make -j
$sudo make install
$php --ri swoole //async redis client => enable 说明编译成功
进程 进程就是正在运行的程序的实例 PHP_EOL换行符
$process = swoole_process(function(swoole_process,$pro){
$pro->exec('realpath/php',[http_server.php]);//执行一个外部程序
},true); //true 输出到管道 false 输出到服务端口
$pid = $process->start() //创建的子进程
//进程关系 $pstree -p 22727 (主进程号)
文件父进程->创建子进程(master主进程)->(manter管理进程)->8个work进程
// $ps aft |grep http_server
swoole 进程间的通信是通过管道实现的
$worker->writer();//内容写进管道
$worker->read();//通过子进程号获取管道的内容
swoolw 内存管理
swoole_table(内存表)数据共享 buffer lock
swoole coroutine协程 2.0.8及以上自动开启 必须在swoole回调函数使用 可增加抗并发操作
用同步的方式实现异步的方法 可以减少网络耗时的IO操作 如同时获取mysql,redis数据
TASK异步服务 执行耗时操作(发送邮件 广播等)
onTask
onFinish中$data值是onTask return的值 与onTask中$data无关
Swoole的HTTP无法与传统的HTTP兼容,需要自行转换
redis集合2^32数据,50多亿 不用考虑存储性能
Swoole 平滑重启
sigterm(重启服务器) sigusr1(重启work进程) usr2(task进程)
swoole_set_process_name('live_master')主进程起别名
reload.sh脚本
echo "loading..."
pid=`pidof live_master` //根据主进程别名获取信息
echo $pid //返回主进程号
kill -USR1 $pid
echo "loading success"
$sh reload.sh //执行sh脚本平滑重启
百度前端上传图片 webuploader
系统监控与性能优化模块
如何监控服务稳定性 linux swoole php
监控服务 ->监听端口 CPU 内存
linux $netstat -anp | grep 8811 秒级别执行 crotab
$netstat -anp 2>/dev/null | grep 8811 | grep LISTEN | wc -l (wc -l 统计多少行)
php执行脚本 shell_exec('netstat -anp 2>/dev/null | grep 8811 | grep LISTEN | wc -l')
swoole_timer_tick(2000,function(){})
日志作用 10台机器 agent -> apark(计算) -> 数据库(elasticsearch) 分布式存储
mysql 主从分离 redis 分布式 nginx负载均衡 跨地域,跨地域延时
nginx 安装 nginx-1.10.3.tar.gz 普通模式 http://www.baidu.com?s=index/index/index 兼容性较好
nginx 做转发消耗CPU
$tar -zxvf nginx-1.10.3.tar.gz
$cd nginx-1.10.3
$./configure -help //查看配置信息
$./configure --prefix 安装目录 --sbin 启动目录 --config-path配置文件目录 --error-log-path --pid-path --http-log-path
$make
$make install
配置nginx.config 请求静态文件转发
server {
listen 8823;
location / {
root '本地静态文件路径';
index index.html index.htm;
//判断root 静态文件不存在 请求转发
if (!-e $request_filename) {
proxy_pass http://127.0.0.1:8811;
}
}
}
配置nginx.config 负载均衡
http{
upstream swoole_http {
ip_hash; //IP哈希
server 127.0.0.1:8810 weight=2; //weight 权重 不能有空格
server 127.0.0.1:8811 weight=1;
}
server {
listen 8823;
location / {
root '本地静态文件路径';
index index.html index.htm;
//判断root 静态文件不存在 请求转发
if (!-e $request_filename) {
proxy_pass http://swoole_http;
}
}
}
}
启动nginx服务
$./sbin/nginx
$netstat -anp | grep 8823 //查看nginx启动
$hostname -i //查看内网ip