CSpeed v1.1.8 框架發佈新版本啦,新增模型,DI注入容器等

CSpeed micro framework


GitHub

Github:

    https://github.com/liqiongfan/cspeed複製代碼

開發環境

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

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

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

推薦的Nginx配置:

location / {
    try_files $uri $uri/ /index.php$uri$args;
}

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;
}複製代碼

CSpeed安裝

下載源碼後,進入cspeed目錄,按照如下三個步驟進行便可:php

一、/usr/path_to_php/bin/phpize

二、./congure --with-php-config=/usr/path_to_php/bin/php-config

三、make -j8 install

四、重啓服務器Apache或者Nginx的PHP-FPM複製代碼

通過以上步驟後,能夠經過在phpinfo()中查看cspeed擴展或者使用以下函數檢測:
if (extension_loaded('cspeed')) {
// 擴展成功安裝,趕快嘗試吧。
}html


簡單的 WEB 示例

WEB 目錄設置爲以下:mysql

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

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

$app = new \Cs\App();

$app->run();
/* 超簡單的框架已經完成,只須要上面兩行代碼就可完成一個MVC框架 */

/* 注意App類構造函數可選參數Di類對象,如: */
$di = new \Cs\di\Di();

$di->set('view', function(){
    $view = new \Cs\mvc\View();
    $view->setModuleDir('index');
    return $view;
});
/*那麼能夠將此對象傳入App構造函數中*/
$app = new \Cs\App($di);

/* 當進行了上面的步驟後,在控制器中可使用$this-get('view')來獲取設置的對象,
以達到對象複用的目的, 注意控制器必須繼承自 \Cs\mvc\Controller 才能
使用 $this->get('xx') 語法 */複製代碼

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

Index.php:

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

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

http://path_to_cspeed複製代碼

WEB應用路由規則:sql

假設配置的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 內容以下:json

index.php

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

/**
 * 方法的第一個參數支持正則匹配,第二個參數是一個Closure閉包函數
 * 第一個參數支持使用替代符 : {name} 與 {id}, 其中 {name} 表示匹配字母數字橫線而且首字母不是數字的字符串, {id}表示匹配任何數字,注意當使用了替代符的時候,匿名函數包含有一個參數 $match 來一一對應與匹配的替代符,如:
 * $app->get('/index/cspeed-v1/18$', function($match){
 * 
 * });
 * 那麼 $match[1] 則表示 cspeed-v1 $match[2]表示爲18,依次類推
 */
$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類的時候,可使用以下兩種方法使用:

方法1:
    use app\controllers\Index;

    $index = new Index();

方法2:
    $index = new \app\controllers\Index();

以上兩種方法均可以使得CSpeed框架自動加載您剛剛編寫的Index.php文件。複製代碼

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']);複製代碼

模型

CSpeed框架僅提供一個簡單的MySql類以及一個ModelInterface接口供用戶本身實現模型或者加強現有的模型:

$mysql = new \Cs\db\pdo\MySql([
    'dsn'          =>    'mysql:host=localhost;dbname=cspeed',
    'username' =>     'root',
    'password'  =>    '3333'
]);

/* 查詢一條記錄 */
$mysql->select(['id', 'price', 'name'])->from('www_product')
      ->where(['id' => 88])->find();

/* 查詢知足條件的全部記錄 */
    $mysql->select(['id', 'price', 'name'])->from('www_product')->findAll();

    /* 執行原生SQL查詢 */
    $mysql->query(" SELECT * FROM www_product ");
    $results = $mysql->execute(); 

    /* 執行預處理 */
    $mysql->query(' INSERT INTO www_product (id, price, name) VALUES (:id, :price, :name) ', [':id' => 33, ':price'=>3.33, ":name"=>"Apple"]);
    $mysql->exeucte();
    /* 獲取剛剛插入的數據ID */
    $id = $mysql->lastInsertId();複製代碼

測試結果

測試機器:    
    一、SSD 240GB
    二、Intel Core i7-4790k
    三、16GB 1866GHZ內存 
    四、Linux Debian 8.x kernel 4.4.x
    五、PHP 7.1.8
    六、Nginx 1.12.1

siege 3.0.8

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

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

API 索引

Cs\App 類

/* 構造函數 */
public function __construct($di);
參數:
    $di:    
        Cs\di\Di類的對象

/* 框架的自動加載函數 */
public function autoload();

/* 匹配GET請求 */
public function get($url, $closure);
參數:
    $url:    
        可選正則URL匹配表達式,替代符{name}:字符數字橫線,且首字母不是數字
    $closure:
        閉包函數,當URL匹配成功後執行的函數

/* 匹配POST請求 */
public function post($url, $closure);
參數:
    $url:    
        可選正則URL匹配表達式,替代符{name}:字符數字橫線,且首字母不是數字
    $closure:
        閉包函數,當URL匹配成功後執行的函數

/* 匹配PUT請求 */
public function put($url, $closure);
參數:
    $url:    
        可選正則URL匹配表達式,替代符{name}:字符數字橫線,且首字母不是數字
    $closure:
        閉包函數,當URL匹配成功後執行的函數


/* 匹配PATCH請求 */
public function patch($url, $closure);
參數:
    $url:    
        可選正則URL匹配表達式,替代符{name}:字符數字橫線,且首字母不是數字
    $closure:
        閉包函數,當URL匹配成功後執行的函數


/* 匹配DELETE請求 */
public function delete($url, $closure);
參數:
    $url:    
        可選正則URL匹配表達式,替代符{name}:字符數字橫線,且首字母不是數字
    $closure:
        閉包函數,當URL匹配成功後執行的函數

/* 匹配 HEAD 請求 */
public function head($url, $closure);
參數:
    $url:    
        可選正則URL匹配表達式,替代符{name}:字符數字橫線,且首字母不是數字
    $closure:
        閉包函數,當URL匹配成功後執行的函數

/* 匹配 OPTIONS 請求 */
public function options($url, $closure);
參數:
    $url:    
        可選正則URL匹配表達式,替代符{name}:字符數字橫線,且首字母不是數字
    $closure:
        閉包函數,當URL匹配成功後執行的函數

/* 設置別名,系統憑藉別名導入文件 */
public function setAlias($aliasKey, $aliasFullPath);
    參數:
        $aliasKey:
            別名名稱
        $aliasFullPath:
            別名指向的絕對路徑

/* CSpeed 框架執行URL分析 */
public function run();複製代碼

Cs\db\ModelInterface 接口

/* SQL SELECT 字段 */
public function select( array $fields);
    參數:
        $fields:
            數組類型,SELECT查詢的字段內容如:['id', 'price', 'name']

/* FROM */
public function from($from);
    參數:
        $from:
            SELECT查詢的表名,字符串類型

/* WHERE */
public function where(array $where);
    參數:
        $where:
            數組類型,WHERE條件,如:['id'=>22, 'name'=>'cspeed']

/* GROUP BY */
public function groupBy($groupBy);
    參數:
        $groupBy:
            數組類型,GROUP BY條件, 如:[ 'name', 'price' ]

/* HAVING */
public function having($having);
    參數:
        $having:
            數組類型,HAVING條件,如:[ 'id' => 22 ]

/* ORDER BY */
public function orderBy($orderBy);
    參數:
        $orderBy:
            數組類型, ORDER BY條件,如:[ 'price DESC', 'create_time DESC' ]

/* LIMIT */
public function limit($num, $offset);
    參數:
        $num : 
            查詢的數量,如:20
        $offset:
            查詢偏移量,如:2

/* 執行原生的SQL語句,支持預處理綁定變量 */
public function query($rawSql, $bindParms);
    參數:
        $rawSql:
            字符串類型,執行的SQL語句,如:
                SELECT * FROM www_product
        $bindParams:
            數組類型,綁定變量,若是SQL中使用了綁定變量的,那麼此參數對應,如:query('INSERT INTO www_product (name, price) VALUES(:name, :price)', [ ':name' => 'Apple', ':price' => '8.8' ]);

/* 執行原生查詢的結果 */
public function execute();複製代碼

Cs\db\pdo\MySql 類

繼承自 : Cs\db\ModelInterface

自增的方法以下,其他方法同ModelInterface類

/* WHERE */
public function andWhere($andWhere);
    參數:
        $andWhere:
            數組類型, 同where方法,能夠屢次調用本方法,來組合多個WHERE條件

/* 啓用事務 */
public function begin();

/* 回退事務 */
public function rollback();

/* 提交事務 */
public function commit();

/* 最新的一條記錄的ID */
public function lastInsertId();

/* 受影響的記錄數 */
public function rowCount();

/* 查詢一條知足條件的SQL,並返回結果 */
public function find();

/* 查詢知足條件的SQL,返回結果集 */
public function findAll();複製代碼

Cs\di\Di 類

/* 執行構造函數 */
public function __construct();

/* 容器注入 */
public function set($key, $closure);
    參數:
        $key:
            容器對象的字符串索引,如:'view'
        $closure:
            閉包函數,返回一個相應的對象實例,如:
    $di = new Cs\di\Di();
    $di->set('view', function(){
        return new \Cs\mvc\View();
    })

/* 容器的對象取出 */
public function get($key);
    參數:
        $key:
            字符串類型,須要從容器中取出的對象的字符串索引,如:
    $di = new Cs\di\Di();
    $view = $di->get('view');複製代碼

Cs\mvc\Controller

繼承自 Cs\di\Di 類

CSpeed框架的默認控制器, 用戶控制器通常須要繼承自本控制器複製代碼

Cs\mvc\View 類

CSpeed框架的默認視圖引擎

/* 構造函數 */
public function __construct();

/* 渲染視圖模板 */
public function render($template, $variables);
    參數:
        $template:
            待渲染的視圖模板名稱,不須要帶後綴,默認的文件後綴爲 phtml
        $variables:
            數組類型,模板中須要使用的變量

/* 設置模板的後綴 */
public function setSuffix($suffixName);
    參數:
        $suffixName:    模板的後綴名稱,默認爲 phtml,如需替換爲html,則:
    setSuffix('html'), 便可。

/* 設置模板中須要使用的變量,能夠屢次調用 */
public function setVar($varName, $varValue);
    參數:
        $varName:    變量名稱
        $varValue:        變量內容

/* 獲取模板的渲染結果,並返回不進行輸出操做 */
public function getRender($template, $variables);
    參數:同render,這裏不在重複講解

/* 設置視圖目錄路徑名 */
public function setViewDir($dirPath);
    參數:
        $dirPath:
            設置視圖的路徑目錄名,默認爲 ../views,表示上一級目錄的views文件夾內,如需更改成 上一級目錄的 view 目錄下,則以下調用:
    setViewDir('../view');

/* 設置模板的模板名路徑 */
public function setModuleDir($moduleName);
    參數:
        $moduleName:    默認爲 "." 表示當前目錄,除非有須要請勿更改。

/* 渲染視圖 */
public function partial($template, $variables);
    參數:
        $template: 模板路徑名稱,相對於當前的模塊而言
        $variables: 在模板中使用的變量集合,數組類型複製代碼

Cs\net\Request 類

/* 獲取 host 信息 */
public function getHttpHost();

/* 獲取 User Agent 信息 */
public function getHttpUserAgent();

/* 獲取 Server Name 信息 */
public function getServerName();

/* 獲取 Server Addr 信息 */
public function getServerAddr();

/* 獲取 Remote Port 信息 */
public function getRemotePort();

/* 獲取 Remote Addr 信息 */
public function getRemoteAddr();

/* 獲取 Request Scheme 信息 */
public function getReqeustScheme();

/* 獲取 Server Protocol 信息 */
public function getServerProtocol();

/* 獲取 Document Root 信息 */
public function getDocumentRoot();

/* 獲取 Request Uri 信息 */
public function getRequestUri();

/* 獲取 Script Name 信息 */
public function getScriptName();

/* 獲取 PATH-INFO 信息 */
public function getPathInfo();

/* 獲取Query String 信息 */
public function getQueryString();

/* 是否GET請求 */
public function isGet();

/* 是否 PUT 請求 */
public function isPut();

/* 是否PATCH請求 */
public function isPatch();

/* 是否DELETE請求 */
public function isDelete();

/* 是否HEAD請求 */
public function isHead();

/* 是否OPTIONS請求 */
public function isOptions();

/* 獲取 $_GET 參數 */
public function get();

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

Cs\net\Response 類

/* 構造函數 */
public function __construct();

/* 設置RESPONSE HEADER */
public function setHeader($headerName, $headerValue);
    參數:
        $headerName:    HTTP header 信息
        $headerValue:    HTTP header值,如:
    setHeader('Content-Type', 'application/json;charset=UTF8');

/* 取消設置的HTTP header */
public function unsetHeader($heaerName);
    參數:
        $headerName : 經過setHeader設置的 $headerName 值

/* 發送HTTP內容與http header */
public function send();

/* 設置響應內容爲JSON */
public function setJsonContent($content);
    參數:
        $content:    須要響應的JSON內容, 如:
    setJsonContent(['status' => 'OK', 'data' => ['a', 'b', 'c'], 'code' => '200']);

/* 設置原始響應內容 */
public function setRawContent($content);
    參數:
        $content:    須要響應的內容, 如:
    setRawContent('<h1>Hello CSpeed</h1>');複製代碼
相關文章
相關標籤/搜索