swoolefy-基於swoole擴展實現的高性能的常駐內存型API和Web應用服務框架

swoolefy

swoolefy是一個基於swoole擴展實現的輕量級高性能的常駐內存型的API和Web應用服務框架,高度封裝了http,websocket,udp服務器,以及基於tcp實現可擴展的rpc服務,同時支持composer包方式安裝部署項目。基於實用,swoolefy抽象Event事件處理類,實現與底層的回調的解耦,支持同步|異步調用,內置view、Log、session、mysql、redis、memcached、mongodb等經常使用組件等。php

swoolefy是一個適合學習swoole的框架,特別適合中小團隊,用過Tp的phper基本都會用,有過Yii2的經驗者,那就更容易入手了。同時swoolefy底層屏蔽了swoole與傳統php-fpm的一些差別,讓大部分的phper使用起來能夠像使用php-fpm那樣,輕鬆入手。html

實現的功能特性

一、輕量級的框架,實現路由與調度,MVC三層,固然也能夠配置多層
二、支持composer的PSR4規範和實現自定義註冊命名空間
三、支持多協議,目前支持http,websocket,tcp,udp,以及基於tcp實現的rpc,開放式的系統接口,可自定義協議數據格式
四、抽象Event的事件處理與底層的事件監聽解耦,屏蔽不一樣協議之間的應用差別,大部分代碼實現共用
五、實現超全局變量,IOC,靜態延遲綁定,組件服務常駐內存化,trait的多路複用,鉤子事件,單例,工廠模式等
六、簡單易用的異步任務管理TaskManager, 定時器管理TickManager, 內存表管理TableManager, 進程管理ProcessManager,異常管理,超全局管理
七、靈活多層的配置,配置參數便可實現底層已封裝的複雜功能
八、應用對象的深度複製,實現對象的常駐內存,每一個請求只須要從內存中複製應用對象,不須要再從新建立,減小IO消耗
九、封裝View,Log,Mysql,Redis,Mongodb,Swiftmail,Session等經常使用組件,其餘組件根據業務按照約定便可封裝成組件
十、實現異步半阻塞與全異步非阻塞,EventHander與底層解耦
十一、基於inotify實現自動監控swoole服務的文件變更,實現worker自動reload,智能郵件通知
十二、命令行形式高度封裝啓動|中止控制的腳本,簡單命令便可管理整個框架 前端

項目地址:https://github.com/bingcool/s...,歡迎issuemysql

完善的文檔手冊linux

壓測

環境:1核2G內存的虛擬機,沒有任何調優,100併發,100000請求,壓測輸出hello world
ab -c 100 -n 100000 http://127.0.0.1:81/Index/index
壓測能夠達到2600qpsnginx

圖片描述

應用場景

一、swoolefy建議用在單個或多個的服務中,例如異步郵件統發中心,搜索中心,日誌上報中心,聊天系統,實時數據上報中心。好比用於實現了基於solr的產品搜索中心,店慶時交易系統實時訂單以及銷售數據看板
二、對於複雜的業務場景,不建議使用swoolefy,傳統的php-fpm是最好的選擇,固然,分拆服務解耦後,某些服務可使用swoolefy來實現。git

配置環境

安裝實際環境(建議)

一、支持php7.0+
二、搭建lnmp環境,建議使用lnmp一健安裝包,https://lnmp.org, 建議安裝lnmp1.4
三、安裝php必要的擴展,本框架須要的擴展包括swoole(1.9.17+), swoole_serialize(https://github.com/swoole/swo... inotify, pcntl, posix, zlib, mbstring,能夠經過php-m查看是否安裝了這些擴展,若是經過lnmp1.4一健安裝包安裝的,已經默認安裝好這四個pcntl, posix, zlib, mbstring擴展的,只須要在安裝swoole和swoole_serialize, inotify便可,具體安裝過程參考官方文檔github

docker容器已經配置好的php環境(開發測試)

爲了方便開發和測試,我打包了一個基於alpine基礎鏡像搭建的php7.1環境容器bingcool/php2swoole:2.4,這個image已經很是小了,已經安裝全部的必須擴展,其中swoole是1.10.4版本,能夠經過php --ri swoole 查看信息。
alpine的官網:https://pkgs.alpinelinux.org/...web

docker pull bingcool/php2swoole:2.4

已安裝的擴展以下:redis

bz2    
Core    
curl   
date   
fileinfo    
filter    
ftp    
gd    
hash     
imagick    
inotify    
json   
libxml    
mbstring    
mcrypt  
memcached  
mongodb  
mysqlnd   
openssl  
pcntl  
pcre   
PDO   
pdo_mysql  
posix   
readline   
redis   
Reflection   
session   
SimpleXML   
soap    
sockets   
SPL    
standard    
swoole   
swoole_serialize    
xml    
xmlrpc   
Zend OPcache    
zip    
zlib    
[Zend Modules]     
Zend OPcache

開發部署

一、若是是本身安裝的php環境(需在linux環境下),最好先建立一個不能登陸僞用戶www,用來執行worker進程業務代碼

useradd www -d /home/www -s /sbin/nologin

則在某一個web目錄,例如/home/www下

參考文檔

二、使用bingcool/php2swoole容器啓動php開發環境
下面是簡單使用,首先是啓動容器

docker run -it -d --name dev -p 9502:9502 -v /home/www/:/home/www/ bingcool/php2swoole:2.4

-v /home/www/:/home/www/ 是將縮主機的/home/www目錄掛載到容器的/home/www

(1)而後進入容器

docker exec -it dev /bin/sh

容器中已經安裝好composer和git等工具,而後利用composer方式來安裝部署一個項目,一樣參考
參考開發文檔

監控程序

一、啓動文件自動監控程序,進入項目目錄

當前終端啓動:php start.php start monitor    
守護進程啓動:php start.php start monitor -d         
中止:php start.php stop monitor

能夠在配置文件swoolefy/protocol/monitor/config.php設置。監控程序自動監控php的文件變更,而後swoole的worker自動重啓,這個文件實際上是經過調用代碼Shell文件夾的swoole_monitor.sh來監控9502端口(這個是swoole的http服務的默認端口),根據端口監聽,能夠設置不一樣端口,監聽不一樣協議服務。
須要注意的是,因爲在容器中/home/www的目錄是掛載與縮主機的,inotify是沒法監聽到文件變更的,因此這個監控程序在容器環境中是無效的,每次修改代碼必須重啓

http服務

二、啓動swoole的http服務,進入進入項目目錄

啓動:php swoolefy start http  
守護進程啓動:php swoolefy start http -d            
中止:php swoolefy stop http

默認端口是9502,能夠在配置文件protocol/http/config.php中更改,同時對應的protocol/monitor/config.php中對應更改端口,實現不一樣的自動重載。
注意文件權限問題

websocket服務

一、啓動swoole的websocket服務,進入swoolefy

啓動:php swoolefy start websocket 
守護進程啓動:php swoolefy start websocket -d            
中止:php swoolefy stop websocket

默認端口9503,能夠在配置文件protocol/websocket/config.php中更改

rpc服務

一、啓動swoole的rpc服務,進入進入項目目錄

啓動:php swoolefy start rpc     
守護進程啓動:php swoolefy start rpc -d        
中止:php swoolefy stop rpc

默認端口9504,能夠在配置文件protocol/rpc/config.php中更改。

udp服務

一、啓動swoole的rpc服務,進入進入項目目錄

啓動:php swoolefy start udp    
守護進程啓動:php swoolefy start udp -d     
中止:php swoolefy stop udp

默認端口9505,能夠在配置文件protocol/udp/config.php中更改。

訪問Index

在App/Controller中就能夠編碼測試,基本和thinkphp的mvc那樣操做。
好比在App/Controller/IndexController.php

<?php
namespace App\Controller;

use Swoolefy\Core\Application;
use Swoolefy\Core\Controller\BController;

class IndexController extends BController {

    public function index() {
        $this->response->end('hello word!');
    }

}

那麼直接在瀏覽器輸入http://ip:9502/Index/index
若須要渲染模板

<?php
namespace App\Controller;

use Swoolefy\Core\Application;
use Swoolefy\Core\Controller\BController;

class IndexController extends BController {

    public function index() {
        $this->assign('name','hello word!');
        $this->display('index.html');

}

對應的路由規則:

controller/action

若是存在module模塊:

module/controller/action

具體的能夠參考App/Controller/的demo

若是須要使用mysql,redis,mongodb這些組件功能,請安裝對應的擴展和服務,並在App/Config/config.php中配置。這個與Yii2的Component類似.

nginx代理

爲了使用更好支持的HTTP協議,建議前端使用nginx做爲代理,更多功能能夠看proxy模塊來設置

location / {
            proxy_http_version 1.1;
            proxy_set_header Connection "keep-alive";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://127.0.0.1:9502;
        }
相關文章
相關標籤/搜索