# CSpeed **Repository Path**: eemcmc/cspeed ## Basic Information - **Project Name**: CSpeed - **Description**: CSpeed 框架,全堆栈的轻量级C语言PHP扩展框架,以高性能、极速为目标。 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 17 - **Created**: 2017-12-16 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CSpeed v2.1.8手册 # ## QQ群交流 ## https://jq.qq.com/?_wv=1027&k=5kSunAR CSpeed扩展官方QQ群号: **605383362** ## 最新特性 ## **CSpeed v2.1.8特性:** 1、配置文件变更: ```shell [db] db.mater.type = mysql ; 数据库类型,默认:mysql db.mater.host = localhost ; 数据库主机地址 db.mater.port = 3306 ; 数据库端口 db.mater.dbname = cspeed ; 数据库名称 db.mater.username = cspeed ; 数据库用户名 db.mater.password = cspeed ; 数据库密码 ``` 新版本配置文件: ```shell [db] db.master.dsn = 'mysql:host=localhost;port=3306;dbname=supjos' ; 数据库类型,默认:mysql db.master.username = root ; 数据库用户名 db.master.password = 3333 ; 数据库密码 ``` 变更的主要原因在与使用```PDO```形式的dsn,能够更好的兼容各种数据库:Oracle、Pg、SqlServer等 2、增加支持多数据库配置链接与切换: ```php $di->set('db1', function(){ /* 省略任何参数表示从ini配置文件获取 */ return new \Cs\db\pdo\Adapter(); }); $di->set('db2', function(){ /* 省略的参数系统自动从ini配置文件获取 */ return new \Cs\db\pdo\Adapter([ 'dsn' => 'mysql:host=localhost;port=3308;dbname=product', 'username' => 'root', 'password' => 'root' ]); }); ``` 如上配置了两个数据库链接,如果在使用模型的过程中需要进行切换,可以使用模型的方法: ```php /* 表示当前模型操作```db2```数据库 */ $model->setDb('db2'); /* 表示当前模型操作```db1```数据库 */ $model->setDb('db1'); ``` 更加方便的方式是在模型的构造函数中使用本方法: ```php on(User::EVENT_BEFORE_SAVE, [$this, 'beforeSave']); $this->setDb('db2'); } function beforeSave() { echo "BeforeSave
"; } public function tableName() { return 'www_product'; } } ``` 注意:```\Cs\db\pdo\Adapter```类本身就表示一个数据库链接,故```\Cs\db\pdo\Adapter```不支持数据库切换,用户可以直接使用```\Cs\db\pdo\Adapter```进行数据库的操作,CSpeed引擎的```\Cs\mvc\Model```本身就是基于```\Cs\db\pdo\Adapter```进行的二次封装. 可以直接使用 ```\Cs\db\pdo\Adapter``` 分别操作数据库: ```php $db1 = $this->di->get('db1'); $db1->query('UPDATE xxx FROM xxx SET xx=xx'); $db1->execute(); ``` 或者使用预处理: ```php $db1 = $this->di->get('db1'); $db1->query('UPDATE xxx FROM xxx SET xx=?', [99]); /* 或者如下的绑定名 */ $db1->query('UPDATE xxx FROM xxx SET id=:id', [‘id’ => 99]); $db1->execute(); ``` **CSpeed v2.1.5特性:** 新增 ```composer``` 支持。使用如下两种方式加载```composer```: 1、入口文件处 ```php $app->setComposerLoader("xxx/autoload.php"); ``` 2、在框架的任何位置均可使用此方法加载 ```composer``` ```php \Cs\App::getApp()->setComposerLoader("xx/autoload.php"); ``` **CSpeed v2.1.4特性:** 1、修复 **Cs\rpc\Server** bug 由于在每次请求中,RPC必须携带一个 ID 标识, 故正常情况下 `1` 标识一个正常的返回值,在2.1.4版本中,修复为返回值 `-1` 即表示请求出错. 2、新增 **CLI** 命令行模式支持 CSpeed CLI模式下,只需要在入口文件添加如下代码即可启动一个 CLI 模式的CSpeed 框架系统,以便进行需要长时间的请求或者数据处理。 假设入口文件名称为: console.php ```php run($argv[1]); ``` 其中 **$argv[1]** 表示 命令行界面的输入参数信息,添加了如上的代码后,用户只需要在入口文件的目录下启动 “终端” or “命令行”,输入如下命令,请事先设置好环境变量或者使用 **PHP** 绝对路径: ```php php console.php index/good/info ``` 就会导向到 **index** 模块 **Good** 控制器 **infoAction** 方法 命令行模式也支持使用参数,如上所示: ```php php console.php index/good/info/name/cspeed ``` 那么在 **index** 模块 **Good** 控制器 **infoAction** 方法内,可以使用全局变量 **$_GET['name']** 或者CSpeed引擎的网络模块 **\Cs\net\Request** 的 **get('name')** 来获取 命令行模式下的传入参数 **name** 的值 **cspeed**。 **CSpeed v2.1.0特性:** 1、修复现有的系统BUG,提升性能. 2、增加 **观察者模式事件模型**,如: ```php on(Index::EVENT_BEFORE_ACTION, [$this, '_beforeAction']); $this->on(Index::EVENT_AFTER_ACTION, function(){ echo "After action.
"; }); } function _beforeAction() { echo '_before action
'; } } ``` **CSpeed** 引擎的事件模型继承于 **Cs\tool\Component** 类,所有需要使用事件特性的需求,需要继承父类 **\Cs\tool\Component**,父类代码如下: ```php on(Index::EVENT_BEFORE_ACTION, [$this, '_beforeAction']); // 绑定方法执行之后的事件 $this->on(Index::EVENT_AFTER_ACTION, function(){ echo "After action.
"; }); } /** * 方法执行执行会执行本方法 */ function _beforeAction() { echo '_before action
'; } } ``` **CSpeed v2.0.3特性:** 1、修复模型错误,优化整体架构 2、增加JSON-RPC模块,示例如下: 客户端: ```php $client = new \Cs\rpc\Client("http://www.xxx.com/who"); $result = $client->goods(['name' => 'apple', 'price' => '9.99']); /* RPC 服务端返回的JSON数据 */ echo $result; ``` 服务端: CSpeed服务端JSON-RPC类Server继承于 \Cs\mvc\Controller: 故控制器如下: ```php handle($this); } /** * RPC方法后缀为Rpc,方法包含有一个参数为客户端调用的参数 * 数据类型与客户端调用的类型一致 */ function listRpc($params) { /* 只需要将返回的数据return即可 */ return $params; } } ``` 注意: CSpeed框架的```RPC```模块使用```Linux-libcurl```库进行开发,用户需要安装```libcurl 7.10.5```版本以上的类库文件即可。 数据调用的格式如下: 客户端调用传输的格式为: ```php {"id":3, "method":"xx", "params":"xx", "jsonrpc":"2.0"} ``` 服务端返回的数据格式为: ```php {"jsonrpc": "2.0", "result": 19, "id": 3} ``` 如果错误则包含一个 error 错误对象: ```php {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Invalid JSON reqeust data"}, "id": -1} ``` 当前版本中,如果出错,则返回的JSON数据中 ```id``` 始终为 ```1```, 如果正确则返回请求数据的 ```id``` 与之对应。新版本中 v2.1.4中已经修复为 ```-1``` 表示出错,并且携带有 ```error```对象. 修复使用 CSpeed 框架进行 API 项目时的高并发情况下的PHP崩溃的情况。 ```php $app = new App::getApp(); $app->get('/', function(){ echo "hello cspeed"; }); ``` 此情况见于 2.0.0 版本。已在新版本中予以修复。 **CSpeed v2.0.1特性:** 新版本中 **getApp()** 方法是一个单例模式控制器获取方法;不再适应于创建一个 **Cs\App** 对象, 新版本中全部更新为 构造函数形式。可以不传入任何的参数来生成一个 零 IO 消耗的 application 对象 。 控制器全部更新为命名空间形式,如路由: http://www.supjos.com/hello/cspeed/news 导向到的是 **hello** 模块中的 **Cspeed** 控制器中的 **newsAction** 方法: 控制器的格式如下: 左右的控制器都必须继承自 **Cs\mvc\Controller** 类: bootstrap()->run(); Cs\App类的构造函数支持传入绝对路径或者相对路径的INI文件,第二个参数是INI配置文件的解析节点,构造函数的两个参数都可以省略来进行API框架的配置达到减少IO操作的目的. 一个复杂的**WEB应用**就只需以上两行代码就可搞定。 2、API示例 $app = new \Cs\App(); $app->get('/hello/cspeed/:any:', function($any){ echo "
Hello CSpeed User, The any value is : $any.
"; }); **RESTful API** 项目只需要添加对应的请求方法即可。 ## CSpeed引擎INI配置项 ## [core] core.application = '../app' ; WEB目录 core.bootstrap = '../app/bootstrap.php' ; 指定bootstrap 类目录 core.bootstrap.method.string = '__init' ; 指定Bootstrap类的初始化方法的前缀 core.router.modules = index,home,back ; 注册多模块 core.router.default.module = index ; 默认模块 core.router.default.controller = Index ; 默认控制器 core.router.default.action = index ; 默认方法 core.view.ext = phtml ; 视图文件后缀 core.view.auto.render = 0 ; 是否自动渲染视图,1:自动渲染、0:不渲染 [db] db.master.type = mysql ; 数据库类型,默认:mysql db.master.host = localhost ; 数据库主机地址 db.master.port = 3306 ; 数据库端口 db.master.dbname = supjos ; 数据库名称 db.master.username = root ; 数据库用户名 db.master.password = 3333 ; 数据库密码 [dev:core] core.application = '../app' ; WEB目录 core.bootstrap = '../app/bootstrap.php' ; 指定bootstrap 类目录 core.bootstrap.method.string = '__init' ; 指定Bootstrap类的初始化方法的前缀 core.router.modules = index,home ; 注册多模块 core.router.default.module = index ; 默认模块 core.router.default.controller = Index ; 默认控制器 core.router.default.action = index ; 默认方法 core.view.ext = xhtml ; 视图文件后缀 ## 典型的Bootstrap初始化类 ## class Bootstrap implements \Cs\Bootstrap { /* 初始化路由与视图 */ function __initRouter($di, $router) { $di->set('view', function(){ return new \Cs\mvc\View(); }); $router->add( '/back/:action:/:id:', '/shop/list/$1' ); $router->add( '/shop/:controller:/:action:/:any:', '/get/\1/\2/\3' ); } /* 初始化数据库连接 */ function __initDb($di, $router) { $di->set('db', function(){ return new \Cs\db\pdo\Adapter(); }); } } ## 典型的控制器结构 ##