yaf swoole api socket servers
PHP CSS JavaScript
Latest commit a86e234 Jan 17, 2017 km3945 修复medoo类的内存泄漏问题
Permalink
Failed to load latest commit information.
_data/Index init Jan 10, 2017
_doc init Jan 10, 2017
application 修复medoo类的内存泄漏问题 Jan 17, 2017
conf init Jan 10, 2017
service init Jan 10, 2017
.gitignore init Jan 10, 2017
README.md edit readme.md Jan 10, 2017
call.php init Jan 10, 2017
run.php init Jan 10, 2017

README.md

ysapi

简介

  • ysapi是一个由 swoole + yaf 实现socket服务基础框架.
  • 由swoole实现socket服务,对外提供API接口, yaf负责api对应的业务逻辑.

功能介绍

  • 基于socket提供更快的数据返回
  • 基于swoole多进程task模型,实现多任务并行处理
  • 客户端单次调用,服务端自动拆分任务给多个task进程并发处理,并一次返回给客户端
  • 每次调用生成唯一ID,此ID可把当次所有请求,任务串联起来,依此分析程序问题
  • DB, REDIS, MQ均长连接常驻,减少网络IO
  • 基于yaf,提供可靠,快速,简单的业务开发
  • 基于MQ异步收集请求日志(这个是可选的)
  • 这是一个裸的,基础的,可以在这基础上修改成适合自己业务的服务.

主要解决的问题

  • 基于swoole开发servers时,每次修改业务代码,或调试,都要重启整个服务或reload,才能看到调试信息或结果
  • 这种开发体验是很难受的,很影响工作效率.
  • 那能不能像传统开发一样,用浏览器来调试业务逻辑呢?
  • 每次只用修改->保存->刷新浏览器就能看到调试信息和结果,和以往的工作方式一样.
  • 答案是肯定的.
  • 基于yaf的特点,很方便的实现.
  • 当业务逻辑实现以后,只要发布或重启servers即可.

安装

必要的扩展

  • nginx
  • mysql 5.7
  • PHP 7.1
  • extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/yaf.so
  • extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/yaconf.so
  • extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/swoole.so
  • extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/msgpack.so
  • extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/amqp.so
  • extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/igbinary.so
  • extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/redis.so
  • extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/donkeyid.so

php.ini扩展配置

[DonkeyId]
;0-4095
donkeyid.node_id=0
;0-Timestamp
donkeyid.epoch=0

[yaconf]
yaconf.directory=/tmp/yaconf
; yaconf.check_delay=0

[yaf]
yaf.environ = product           ; develop test
yaf.use_namespace = 1
; yaf.action_prefer = 0
; yaf.lowcase_path = 0
; yaf.library = NULL
; yaf.cache_config = 0
; yaf.name_suffix = 1
; yaf.name_separator = ""
; yaf.forward_limit = 5
; yaf.use_spl_autoload = 0

代码安装

把文件放到

/wwwroot/data_site/ysapi

nginx.conf配置

     server {
        listen       80;
        server_name  api.local.com;
        index index.html index.htm index.php;
        root /wwwroot/data_site/ysapi/service;

        if (!-e $request_filename) {
                rewrite ^/(.*)  /index.php/$1 last;
        }

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                fastcgi_pass  127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include       fastcgi_params;
        }
    }
  • 重启Nginx,修改本机host文件
127.0.0.1 api.local.com

浏览器访问

  • 保存后,重启浏览器打开(以下是yaf默认路由方式):
http://api.local.com/index/index/index/data/def

http://api.local.com/ index/  index/  index/ data/def
                域名/  模块/ 控制器/  方法 / 参数/值

若无问题,将看到: web

之后就可以按yaf的方式开发API业务逻辑

启动 servers

业务代码开发完成后,我们可以reload或重启servers,来提供最新的接口

php /wwwroot/data_site/ysapi/run.php

服务启动无异常,可以使用api调用方法来尝试调用:

php /wwwroot/data_site/ysapi/call.php

客户端接口调用代码用例

  • 用例中我们同时调用3个接口获得不同的数据
try {
    $api = new apicall();
    $api->add('pagelist','index/index/index',['page'=>1]);
    $api->add('user','index/index/index2',['user'=>1]);
    $api->add('mess','index/index/index3',['mess'=>1]);
    $rs=$api->exec('www');
    $code=$rs['code'];
    if($code!=200){
        if($code==500){
            // 全错
        }elseif($code==300){
            // 部份错
        }else{
            // 异常
        }
    }

    $pagelist=$rs['pagelist'];
    $user=$rs['user'];
    $mess=$rs['mess'];

    echo(print_r($pagelist,1));
}catch (Exception $e){
    echo $e->getMessage().PHP_EOL;
    die('ERROR-------------------------------'.PHP_EOL);
}

业务开发

  • 按照YAF的方式去开发接口业务逻辑
  • 新建模块->建控制器->建方法->浏览器访问你的方法进行调试
  • 方法传入的参数可到/_data/模块/控制器文件中定义,如:
// /ysapi/_data/Index/Index.php
// 路径及名字按YAF的方式定义
class IndexData{
    public static $indexAction=[
        'def'=>[
            'page'=>1
        ],
        'p1'=>[
            'page'=>1
        ],
        'p2'=>[
            'page'=>2
        ],
    ];

    public static $index2Action=[
        'def'=>[
            'id'=>1
        ],
        'u1'=>[
            'id'=>1
        ],
        'u2'=>[
            'id'=>2
        ],
    ];

    public static $index3Action=[
        'def'=>[
            'id'=>1
        ],
        'm1'=>[
            'id'=>1
        ],
        'm2'=>[
            'id'=>2
        ],
    ];

// http://api.local.com/index/index/index3/
// http://api.local.com/index/index/index3/data/def
// http://api.local.com/index/index/index3/data/m1
// http://api.local.com/index/index/index3/data/m2