ysapi:由 Swoole + yaf 實現 socket 服務基礎框架

zhengbohan 7年前發布 | 21K 次閱讀 Swoole Socket 網絡技術 yaf

簡介

  • 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</code></pre>

代碼安裝

把文件放到

/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;
    }
}</code></pre> 

  • 重啟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 域名/ 模塊/ 控制器/ 方法 / 參數/值</code></pre>

若無問題,將看到:

之后就可以按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); }</code></pre>

業務開發

  • 按照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 </code></pre>

 

 本文由用戶 zhengbohan 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!