ysapi:由 Swoole + yaf 實現 socket 服務基礎框架
簡介
- 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>