1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

新闻 CSpeed v2.1.0 发布,高性能 C 语言 PHP 框架 下载

本帖由 漂亮的石头2017-11-11 发布。版面名称:软件资讯

  1. 漂亮的石头

    漂亮的石头 版主 管理成员

    注册:
    2012-02-10
    帖子:
    488,069
    赞:
    47
    最新特性


    CSpeed v2.1.0特性:

    1、修复现有的系统BUG,提升性能.

    2、增加 观察者模式事件模型,如:

    <?php

    namespace app\modules\index\controllers;

    class Index extends \Cs\mvc\Controller
    {
    function initialise()
    {
    $this->on(Index::EVENT_BEFORE_ACTION, [$this, '_beforeAction'];
    $this->on(Index::EVENT_AFTER_ACTION, function(){
    echo "After action.<br>";
    });
    }

    function _beforeAction()
    {
    echo '_before action<br>';
    }
    }

    CSpeed 引擎的事件模型继承于 Cs\tool\Component 类,所有需要使用事件特性的需求,需要继承父类 \Cs\tool\Component,父类代码如下:

    <?php

    namespace Cs\tool;

    class Component
    {
    function on($eventName, $eventCallBack);

    function off($eventName, $eventCallBack = NULL);

    function trigger($eventName);
    }

    CSpeed 引擎的系统类中支持事件的有:\Cs\App\Cs\mvc\Controller\Cs\mvc\Model\Cs\rpc\Server 类。

    各个类支持的事件见IDE源码。

    如,在新版本的引擎中,控制器层面由于引入了事件机制,故不在提供**__beforeAction** 与 __afterAction 方法,如果需要在执行方法前执行特定的方法,那么可以使用事件,如:

    <?php

    namespace app\modules\index\controllers;

    class Index extends \Cs\mvc\Controller
    {
    function initialise()
    {
    // 绑定方法执行之前的事件
    $this->on(Index::EVENT_BEFORE_ACTION, [$this, '_beforeAction'];
    // 绑定方法执行之后的事件
    $this->on(Index::EVENT_AFTER_ACTION, function(){
    echo "After action.<br>";
    });
    }

    /**
    * 方法执行执行会执行本方法
    */
    function _beforeAction()
    {
    echo '_before action<br>';
    }
    }

    **CSpeed v2.0.3特性: **

    1、修复模型错误,优化整体架构

    2、增加JSON-RPC模块,示例如下:

    客户端:

    $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

    namespace app\modules\home\controllers;

    class Goods extends \Cs\rpc\Server
    {
    /* RPC类控制器只运行从父类到本类的initialise
    * 只需要在本方法内将本对象绑定到RPC端即可
    */
    public function initialise()
    {
    $this->handle($this);
    }

    /**
    * RPC方法后缀为Rpc,方法包含有一个参数为客户端调用的参数
    * 数据类型与客户端调用的类型一致
    */
    function listRpc($params)
    {
    /* 只需要将返回的数据return即可 */
    return $params;
    }
    }

    注意: CSpeed框架的RPC模块使用Linux-libcurl库进行开发,用户需要安装libcurl 7.0.15版本以上的类库文件即可。

    数据调用的格式如下:

    客户端调用传输的格式为:

    {"id":x, "method":"xx", "params":"xx", "jsonrpc":"2.0"}

    服务端返回的数据格式为:

    {"jsonrpc": "2.0", "result": 19, "id": 3}

    如果错误则包含一个 error 错误对象:

    {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Invalid JSON reqeust data"}, "id": 1}

    当前版本中,如果出错,则返回的JSON数据中 id 始终为 1, 如果正确则返回请求数据的 id 与之对应。

    修复使用 CSpeed 框架进行 API 项目时的高并发情况下的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 类:

    <?php

    namespace app\modules\hello\controllers;

    class Cspeed extends \Cs\mvc\Controllers
    {
    /**
    * 初始化方法,如果有父类的话,则会先从顶级父类开始执行到本方法
    * 来完成初始化
    */
    function initialise()
    {

    }

    /**
    * 具体的方法
    */
    function newsActon()
    {

    }
    }
    安装指南


    CSpeed扩展目前在 Github码云 平台均有代码存储库,用户只需下载源码然后按照如下方法安装即可:

    Github:

    https://github.com/liqiongfan/cspeed

    码云:

    https://gitee.com/josinli/cspeed

    安装步骤:

    1、/usr/local/php_to_path/bin/phpize

    2、./configure --with-php-config=/usr/local/php_to_path/bin/php-config

    3、make install

    编译完成后在 php.ini 配置文件添加如下内容:

    extension_dir = "/usr/local/php-7.1.8-nts/lib/php/extensions/no-debug-non-zts-20160303/"

    extension=cspeed.so

    然后重启 Nginx 的 PHP-FPM 或者 Apache

    4、systemctl restart php-fpm 或者 systemctl restart httpd
    测试性能


    测试命令:

    /usr/local/httpd-2.4.29/bin/ab -c100 -n100000 http://www.supjos.com/hello/cspeed/

    测试机器[特意开启旧的笔记本进行测试,未开启工作站]:

    CPU: Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz
    硬盘:HDD 750GB 2009年
    内存:4G Sansung

    测试环境:

    nginx 1.12.1
    php 7.1.5
    php-fpm

    测试结果:

    Concurrency Level: 100
    Time taken for tests: 9.781 seconds
    Complete requests: 100000
    Failed requests: 0
    Total transferred: 18500000 bytes
    HTML transferred: 0 bytes
    Requests per second: 10223.94 [#/sec] (mean)
    Time per request: 9.781 [ms] (mean)
    Time per request: 0.098 [ms] (mean, across all concurrent requests)
    Transfer rate: 1847.10 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 0.9 0 9
    Processing: 1 9 1.8 9 25
    Waiting: 1 9 1.8 9 24
    Total: 4 10 1.3 10 28
    WARNING: The median and mean for the initial connection time are not within a normal deviation
    These results are probably not that reliable.

    Percentage of the requests served within a certain time (ms)
    50% 10
    66% 10
    75% 10
    80% 10
    90% 11
    95% 12
    98% 13
    99% 13
    100% 28 (longest request)

    测试后单次,不产生任何IO的情况下可以达到 10223reqs/s,持平于1万左右吞吐量。解析ini文件的情况下,可达到将近9千的吞吐量.

    典型项目结构


    +--cspeed 入口文件
    +--app 项目目录
    +---config 配置目录
    |---core.ini 配置文件
    +---models 通用模型目录
    |---User.php User模型
    |---Goods.php Goods模型
    +---modules 模块目录
    +---backend 后台模块
    +---controllers backend模块控制器目录
    |---Index.php Index控制器
    |---About.php About控制器
    +---views 视图目录
    +---index Index控制器的视图目录
    |---index.phtml Index控制器的index方法的视图文件
    +---about About控制器的视图目录
    |---index.phtml About控制器的index方法的视图文件
    +---home Home模块
    +---controllers Home模块控制器目录
    |---Index.php Index控制器
    +---views 视图目录
    +---index Index控制器的视图目录
    |---index.phtml Index控制器的index方法的视图文件
    +---bootstrap.php 框架的初始化类Bootstrap
    +--public 入口目录
    |---index.php 入口文件
    +---assets 资源目录
    +---css CSS资源
    +---js JS资源
    +---img 图片资源
    简单的示例


    1、WEB示例

    $app = new \Cs\App("../app/config/core.ini", "dev");

    $app->bootstrap()->run();

    Cs\App类的构造函数支持传入绝对路径或者相对路径的INI文件,第二个参数是INI配置文件的解析节点,构造函数的两个参数都可以省略来进行API框架的配置达到减少IO操作的目的.

    一个复杂的WEB应用就只需以上两行代码就可搞定。

    2、API示例

    $app = new \Cs\App();

    $app->get('/hello/cspeed/:any:', function($any){
    echo "<div style='text-align:center;'>Hello CSpeed User, The any value is : $any.</div>";
    });

    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();
    });
    }
    }
    典型的控制器结构


    <?php

    namespace app\modules\hello\controllers;

    class Cspeed extends \Cs\mvc\Controllers
    {
    /**
    * 初始化方法,如果有父类的话,则会先从顶级父类开始执行到本方法
    * 来完成初始化
    */
    function initialise()
    {

    }

    /**
    * 具体的方法
    */
    function newsActon()
    {

    }
    }
    典型的模型结构


    <?php

    namespace app\models;

    class User extends \Cs\mvc\Model
    {
    function tableName()
    {
    return "www_product";
    }
    }
    CSpeed v2.1.0 发布,高性能 C 语言 PHP 框架下载地址
     
正在加载...