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

你可能感兴趣的:(swoole自学笔记)