CSpeed 框架,全堆栈的基于 C 语言的 PHP 扩展框架,以高性能为目标

怎么上手?

参照 demo 文件夹里面的 demo 即可快速上手 CSpeed 框架,带你飞、带你吃鸡

使用本框架前,需要您的电脑已经安装了 PHP 7 及以上的版本,并且下载了本源码安装好了 CSpeed 扩展,安装完毕后,启用扩展即可使用 CSpeed 带你吃鸡。

框架特性

1、内置 JSON-RPC 支持

示例:
将需要作为服务端的控制器设置为 RPC 服务端:

namespace app\modules\admin;

class User extends \Cs\rpc\Server
{
    public function initialise()
    {
        $this->handle($this);
    }

    /**
     * 参数为客户端传入
     */
    function listsRpc()
    {
        // 此处返回需要的数据即可, 数组形式,如:
        return [ 'kernel' => 'CSpeed', 'version' => '2.1.11' ];
    }
}

客户端只需要如下使用:

$client = new \Cs\rpc\Client('http://xxx.xxx.com/admin/user');  

$data = $client->lists();
// 也可以传入数据至服务端
$results = $client->lists(['age' => '20'])

2、支持 BootInit 框架统一初始化入口,需要实现 \Cs\BootInit 接口


示例:

此处分为两块初始化:数据库与普通的视图模型等初始化:

class BootInit implements \Cs\BootInit
{
    /**
     * 初始化数据库
     */
    function __initDb()
    {
    }

    /**
     * 初始化其他的数据,比如说 IOC 工厂
     */
    function __initData()
    {
    }

}

3、支持多重数据库连接并切换,数据库使用 DSN 连接方式,原始方式支持多种数据库:PgSQL、MySQL等,数据库连接池正在开发。

模型支持切换数据库:

$model = new app\models\User();

// 设置 master 数据库连接
$model->setDb('master');

// do some job
...

// 切换到 slave 数据库连接
$model->setDb('slave');

切换数据库之前需要在容器中注入相应的数据库,比如上面的 masterslave 数据库:


$di->set('master', function(){
    return new \Cs\db\pdo\Adapter();
});

$di->set('slave', function(){
    return new \Cs\db\pdo\Adapter([
        'dsn' => 'mysql:host=localhost;port=3306;dbname=supjos',
        'username' => 'root',
        'password' => 'root'
    ]);
});

\Cs\db\pdo\Adapter 类一样支持 PDO 的初始化参数,如设置持久连接:

$di->set('slave', function(){
    return new \Cs\db\pdo\Adapter([
        'dsn' => 'mysql:host=localhost;port=3306;dbname=supjos',
        'username' => 'root',
        'password' => 'root',
        'options'  => [
           \PDO::ATTR_PERSISTENT => true, // 持久连接
           \PDO::ATTR_AUTOCOMMIT => 0     // 默认不自动提交
       ]
    ]);
});

4、模型AR特性支持[目前不完善]

5、配置文件[ini]按需加载:\Cs\tool\Config


$config = new \Cs\tool\Configs();
$config->loadConfig('xxx/xxx.ini');

$configs = $config->getConfigs();
// 或者指定获取相应的属性名对应的值
$configValue = $config->getConfigs('db');

6、观察者事件机制支持: \Cs\tool\Component

控制器控制在控制器方法执行之前执行一些入口控制,那么可以使用事件支持:

// 如果控制器内存在本方法,则会从其顶级父类执行到本函数完成初始化
// 注意,不会执行构造函数: __construct(),在构造函数内指定不会生效
// initialise 方法是控制器的初始化函数入口
function initialise()
{
    $this->on(self::EVENT_BEFORE_ACTION, function(){
        echo 'Hello first fun me';
    });
}

initialise方法存在一个参数:$object(名称用户自定,这里假设用户定义为:$object),表示当前控制器类,如:

namespace app\modules\index\controllers;

class Goods extends \Cs\mvc\Controller {
    function initialise($object)
    {
        // 那么 $object 表示当前的控制器类: Goods的对象,打印如下:
        echo '<pre>';
        print_r($object);
        echo '</pre>';
    }
}

7、MVC 三层开发方式

使用了 B/S 开发中最普及的开发模式: MVC

8、配置文件解耦,使用 \Cs\ObjectFactory 解耦


用户可以在 BootInit文件中集体进行类的初始化工作,方便进行模型与业务逻辑的解耦:

假设用户的PHP类模型的工厂配置文件如下:

<?php

return [
    'rsa' => [
        'class'      => '\app\models\User',
        'properties' => [
            'name' => '\app\models\Tools',
            'two'  => '\app\models\Tools'
        ],
        'values'     => [
            'abc'     => new stdClass(),
            'linux'   => 'Yes, I favorite it',
            'windows' => 'No unless do choice'
        ],
        'attrs'       => [
            'private'   => false,
            'public'    => true,
            'protected' => false
        ]
    ],
    'aes' => [
        'class'      => 'Cs\tool\Config',
        'properties' => [
            'data' => 'app\models\User'
        ]
    ]
];

用户只需要按照这个规则即可让模型的初始化与构造工作交给 CSpeed 进行完成,性能与效率也相比较原生PHP的方式较高:

规则:
数组的每一个键名对应于唯一一个类标识ID,
比如上方的是两个类标识ID:
rsa、aes

每一个类标识ID对应一个交给 CSpeed 初始化的类,
如:
rsa 对应于 app\models\User 类,
每个子数组对应于怎么初始化 这个模型类,
class:标识初始化的类,包含命名空间
properties:通过 setter 方法注入相应的对象。
如:

    'properties' => [
        'name' => '\app\models\Tools',
        'two'  => '\app\models\Tools'
    ]

这就告诉 CSpeed 调用:app\models\User 类的 setName 方法,并且方法内有一个对象: app\models\Tools,也就相当于如下的PHP代码

$user = new \app\models\User();
$user->setName(new app\models\Tools());

【注意】:
properties数组包含几个元素就对应于调用几个setter方法。

如果用户不使用 IOC 进行注入,只是想初始化属性,则可以使用 values 数组来执行:

    'values'     => [
        'abc'     => new stdClass(),
        'linux'   => 'Yes, I favorite it',
        'windows' => 'No unless do choice'
    ],

上面代码就会告诉 CSpeed引擎去使用 new stdClass() 值初始化 app\models\User类的 abc 属性,使用 Yes, I favorite it 初始化 app\models\User类的 linux 属性吗,以此类推.

当然为了不影响内部的 private 修饰的属性,可以指定 那种修饰符的属性可以初始化:

    'attrs'       => [
        'private'   => true,
        'public'    => true,
        'protected' => false
    ]

这就告诉 CSpeed 如果属性是 private 修饰,则使用 values数组的相应的值初始化,public 修饰的属性也进行初始化,但是 protected 修饰的属性不进行初始化。

9、命令行模式支持并支持命令行参数传递


$task = new \Cs\console\Task();

// 或者也可以使用参数形式初始化系统,参数格式与 Cs\App 一致
$task = new \Cs\console\Task("xxx/xxx.ini", "dev");

// 运行命令行
$task->run($args[1]);

bash切换到本脚本的目录,键入如下的命令即可:

php -f index.php hello/world/lists

表示让 CSpeed 执行 hello 模块下 world 控制器的 lists 方法

10、强悍的 路由 功能,如

$router = new \Cs\mvc\Router();

$router->add(
    '/back/:action:/:id:',
    '/shop/list/$1'
);
$router->add(
    '/shop/:controller:/:action:/:any:',
    '/get/\1/\2/\3'
);

$router->addFromArray([
      '/shop/:controller:/:action:/:any:' =>'/get/\1/\2/\3',
    '/admin/:controller:/:action:/:any:' =>'/put/\1/\2/\3',
]);
$router->addFromIni('../app/router.ini');

开发者只需要在入口处定义路由,即可以自动的跳转到指定的路由。

原生C语言开发,极致性能,目前已经在 Linux、macOSX 上测试通过

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!