swoole自学笔记

主流框架 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348