CSpeed框架,全堆棧的C框架,以高性能爲目標

CSpeed micro framework written in C

開發環境

Linux kernel 4.4.x、PHP7.1.八、Nginx1.12.1

Github:
    https://github.com/liqiongfan/cspeed

擴展只支持PHP7.x以上版本,低於PHP7.x的版本請先升級PHP

在WEB應用模式下,擴展經過解析 PATH_INFO 參數信息進行路由轉發,請先確保 WEB服務器支持 PATH_INFO 模式,而且須要隱藏index.php
不然系統不生效,沒法完成路由解析。

推薦的Nginx配置:

location / {
# try_files $uri $uri/ /index.php$uri;
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php/$1 last;
    }
# 若是是二級目錄請設置爲二級目錄形式
}

location ~ \.php {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;     
    fastcgi_param  PATH_INFO $fastcgi_path_info;    
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}
複製代碼

簡單的 WEB 示例

WEB 目錄設置爲以下:php

+public
|--index.php            入口文件
+controllers
|--Index.php            Index默認控制器
+admin                  新增admin模塊
|--controllers          admin模塊下的控制器目錄
     |--Index           admin模塊的Index控制器
+fronted                fronted模塊
|--controllers          fronted模塊控制器目錄
    |--Index            fronted模塊Index控制器
複製代碼

public 目錄下 index.php 內容以下:html

$app = new \Cs\App();

$app->run();
/* 超簡單的框架已經完成 */
複製代碼

在 public 同級的目錄controllers下建立一個 Index.php 文件,內容以下:git

Index.php:
	
class Index {
    function indexAction(){
        // 當須要渲染視圖的時候,請使用 $this->view 得到 View 引擎而後使用引擎具備的方法進行視圖渲染 
        echo '<h1>Hello CSpeed</h1>';
    }
}
複製代碼

配置好 Nginx 路由,打開瀏覽器,輸入配置好的網站地址就會看到剛剛輸入的內容:github

http://path_to_cspeed
複製代碼

WEB應用路由規則:web

假設配置的Nginx如上,配置網站 www.supjos.cn 指向:public目錄下的index.php文件

那麼,路由規則以下三種狀況所示:

1)、www.supjos.cn
    不帶PATH_INFO的路由指向與public目錄同級的controllers下的Index.php控制器的indexAction方法
2)、www.supjos.cn/backend/goods/lists
    路由到backend模塊的goods控制器下的listsAction方法
3)、www.supjos.cn/sys/info
    路由到與public同級的controllers目錄下Sys.php下的infoAction方法
複製代碼

注意

控制器文件首字母必須大寫

以下路由所示:
www.supjos.cn/web/index/lists
  模 塊: web            一個模塊對應一個目錄,此處對應web目錄
  控制器: index          控制器文件命名爲 Index.php
  方 法: listsAction    CSpeed系統方法名都以Action結尾
複製代碼

簡單的 API 應用

public 目錄下的 index.php 內容以下:數據庫

index.php

/* 當實例化一個 \Cs\App 類後,系統自動進行 autoload, autoload的機制參見下面介紹 */
$app = new \Cs\App();	

/** * 方法的第一個參數支持正則匹配,第二個參數是一個Closure閉包函數 */
$app->get('/index$', function(){
    echo '<h1>Hello CSpeed</h1>';
});

/* CSpeeed支持常見的請求方法,除了上面的 GET 外,還支持 POST、PUT、DELETE、OPTIONS、HEAD,具體見 API 文檔 */
$app->post('/goods/index/2$', function(){
    /* Your code here. */
});
複製代碼

CSpeed自動加載機制

當實例化一個 \Cs\App 類後,系統自動進行未引用文件的加載, 加載機制採用 「別名引用」機制,具體的原理以下:

系統自動內置一個 app 命名別名,指向 index.php 的上級目錄,以下目錄所示:

+--cspeed                    網站目錄
    +--public
	|--index.php         入口文件
    +--controllers           默認控制器加載目錄
    	|--Index.php
	|--Goods.php
    +--backend               新增模塊backend
	|--controllers       backend模塊的控制器目錄
            |--Index.php			
	    |--Goods.php							
	

若是目錄結構如上所示:

那麼 默認的 `app` 別名指向 cspeed 目錄。
開發者能夠經過 $app->setAlias()來設置別名,具體的設置方法以下:

假設須要設置一個 backend 的別名 指向目錄 /data/supjos/backend ,那麼調用方法以下:
    $app->setAlias('@backend', '/data/supjos/backend');

用戶能夠本身建立一個以下的文件:

<?php

namespace app\controllers;

class Index {
    function getVersion() {
        return 'v2.1.8';
    }
}

那麼當你在CSpeed框架中須要使用 \app\controllers\Index類的時候,可使用以下兩種方法使用:

方法1use app\controllers\Index;

    $index = new Index();

方法2:
    $index = new \app\controllers\Index();
複製代碼

CSpeed 框架的視圖引擎

$view = new \Cs\mvc\View();

/* 方法包含兩個參數, * 第一個參數爲:須要渲染的視圖的文件名 * 第二個參數爲:須要在視圖中使用的變量,傳入一個數據或者不傳入 */
$view->render('index', ['name'=>'CSpeed', 'version'=>'v2.1.8']);

/* 若是須要添加單個變量到視圖模塊中,可使用 setVar 方法 */
$view->setVar('addVar', ['a', 'b' ,'c', 'd']);

/* 若是須要或者視圖的渲染效果可是並不輸入使用 getRender方法,參數與 render 方法一致 */
$viewResult = $view->getRender('index', ['name'=>'CSpeed', 'version'=>'v2.1.8']);

/* 默認的渲染視圖後綴爲 phtml,能夠經過 setSuffix 方法進行更改 */
$view->setSuffix('ppht');

/* 默認視圖文件夾保存在 public 目錄同級的 views 目錄下, 能夠經過 setViewDir 進行更改, 目錄不能以 "/" 結尾 */
$view->setViewDir('../views');

/*視圖內渲染*/
$view->partial('layouts/head', ['a', 'b', 'c']);
複製代碼

模型

鑑於上一個版本中的數據庫性能有影響,本版本正處於重構狀態。開發中~敬請期待.
複製代碼

測試結果

測試機器:	
    1、SSD 240GB
    2、Intel Core i7-4790k
    316GB 1866GHZ內存 
    4、Linux Debian 8.x kernel 4.4.x
    5、PHP 7.1.8
    6、Nginx 1.12.1

siege 3.0.8

測試命令: siege -c100 -t5m -b http://localhost/web

共完成一百九十多萬請求,每次請求4.4kb數據,零錯誤,CPU佔用23%左右內存佔用極低。
複製代碼

API 索引

Cs\App 類

public get($urlPattern, $closure);
正則匹配 $urlPattern 的GET請求

public post($urlPattern, $closure);
正則匹配 $urlPattern 的POST請求

public put($urlPattern, $closure);
正則匹配 $urlPattern 的PUT請求

public patch($urlPattern, $closure);
正則匹配 $urlPattern 的PATCH請求

public delete($urlPattern, $closure);
正則匹配 $urlPattern 的DELETE請求

public head($urlPattern, $closure);
正則匹配 $urlPattern 的HEAD請求

public options($urlPattern, $closure);
正則匹配 $urlPattern 的OPTIONS請求

public autoload();
CSpeed框架的自動加載函數,切勿私自調用

public setAlias($aliasName, $aliasPath);
設置自動加載別名

public run();
CSpeed框架處理URL請求
複製代碼

Cs\mvc\View 類

public __construct();
構造函數

public render($templateFile, $templateVariables);
渲染視圖

public setSuffix($suffixName);
設置視圖的後綴

public setVar($varName, $varValue);
設置視圖中須要使用的變量,本方法能夠屢次調用

public getRender($templateFile, $templateVariables);
獲取渲染的視圖內容

public setViewDir($dir);
設置視圖渲染路路徑

public partial($templateFile, $templateVariables);
視圖內進行渲染視圖,如:佈局layouts
複製代碼

Cs\net\Request 類

public getHttpHost();
獲取HTTP HOST信息

public getHttpUserAgent();
獲取HTTP User Agent信息

public getServerName();
獲取Server Name 信息

public getServerAddr();
獲取Server Addr 信息

public getRemotePort();
獲取 Remote Port 信息

public getReqeustScheme();
獲取Request Scheme 信息

public getServerProtocol();
獲取Server Protocol 信息

public getDocumentRoot();
獲取Document Root 信息

public getRequestUri();
獲取Request Uri 信息

public getScriptName();
獲取Script Name 信息

public getPathInfo();
獲取Path Info 信息

public getQueryString();
獲取Query String 信息

public isGet();
是否GET請求

public isPut();
是否Put請求

public isPatch();
是否Patch請求

public isDelete();
是否DELETE請求

public isHead();
是否Head請求

public isOptions();
是否Options請求

public get();
獲取$_GET參數

public getPost();
獲取$_POST參數
複製代碼

Cs\net\Response 類

public __construct();
構造函數

public setHeader();
設置響應的HTTP HEADER

public unsetHeader();
刪除剛剛設置的HTTP HEADER, 此操做需在調用send方法前使用纔有效

public send();
響應設置的HTTP HEADER與內容

public setJsonContent();
設置響應的內容爲JSON格式

public setRawContent();
設置響應的內容爲原始數據,不進行轉換複製代碼
相關文章
相關標籤/搜索