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
爲了方便開發和測試,我打包了一個基於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是沒法監聽到文件變更的,因此這個監控程序在容器環境中是無效的,每次修改代碼必須重啓
二、啓動swoole的http服務,進入進入項目目錄
啓動:php swoolefy start http 守護進程啓動:php swoolefy start http -d 中止:php swoolefy stop http
默認端口是9502,能夠在配置文件protocol/http/config.php
中更改,同時對應的protocol/monitor/config.php
中對應更改端口,實現不一樣的自動重載。
注意文件權限問題
一、啓動swoole的websocket服務,進入swoolefy
啓動:php swoolefy start websocket 守護進程啓動:php swoolefy start websocket -d 中止:php swoolefy stop websocket
默認端口9503,能夠在配置文件protocol/websocket/config.php
中更改
一、啓動swoole的rpc服務,進入進入項目目錄
啓動:php swoolefy start rpc 守護進程啓動:php swoolefy start rpc -d 中止:php swoolefy stop rpc
默認端口9504,能夠在配置文件protocol/rpc/config.php
中更改。
一、啓動swoole的rpc服務,進入進入項目目錄
啓動:php swoolefy start udp 守護進程啓動:php swoolefy start udp -d 中止:php swoolefy stop udp
默認端口9505,能夠在配置文件protocol/udp/config.php
中更改。
在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類似.
爲了使用更好支持的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; }