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目錄,按照如下三個步驟進行便可: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 目錄設置爲以下: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結尾複製代碼
public 目錄下的 index.php 內容以下:json
index.php
/* 當實例化一個 \Cs\App 類後,系統自動進行 autoload, autoload的機制參見下面介紹 */
$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. */
});複製代碼
當實例化一個 \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文件。複製代碼
$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%左右內存佔用極低。複製代碼
/* 構造函數 */
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();複製代碼
/* 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\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();複製代碼
/* 執行構造函數 */
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\di\Di 類
CSpeed框架的默認控制器, 用戶控制器通常須要繼承自本控制器複製代碼
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: 在模板中使用的變量集合,數組類型複製代碼
/* 獲取 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();複製代碼
/* 構造函數 */
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>');複製代碼