# 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 "