V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
takashiki
V2EX  ›  分享创造

分享一个轻量级的 PHP 路由实现

  •  
  •   takashiki ·
    takashiki · 2016-07-02 20:38:49 +08:00 · 4407 次点击
    这是一个创建于 2826 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Github:https://github.com/takashiki/cdo

    Git@OSC:http://git.oschina.net/takashiki/cdo

    使用很简单,不过只支持 pathinfo 模式,贴一段示例代码:

    $do = new \Mis\Cdo();
    
    $do->get('/', function () {
        echo 'hello world';
    });
    
    $do->post('/', function () {
        $name = isset($_POST['name']) ? $_POST['name'] : 'world';
        echo "hello {$name}";
    });
    
    $do->any('/(\d+)', function ($id) {
        echo $id;
    });
    
    /**
     * When using named subpattern, order of parameters is not matter.
     * eg. /book/2
     */
    $do->any('/(?P<type>\w+)/(?P<page>\d+)', function ($page, $type) {
        echo $type.'<br>'.$page;
    });
    
    $do->run();
    

    或者:

    use Mis\Cdo;
    
    Cdo::get('/', function () {
        echo 'hello world';
    });
    
    Cdo::run();
    

    写这个项目的初衷是前断时间在写一个小项目时发现现在绝大多数 PHP 的路由都不足够轻量,在只有各位数的路由时 QPS 也只能达到不使用路由时的一半左右,于是便自己写了一个,欢迎大家批评指教。

    这是在 index 文件里直接打印 hello world 的 qps:

    QQ截图20160702204339.jpg

    这是使用了路由后的qps:

    QQ截图20160702204316.jpg

    15 条回复    2016-07-07 16:16:00 +08:00
    BMW
        1
    BMW  
       2016-07-02 22:56:48 +08:00
    manhere
        2
    manhere  
       2016-07-02 23:02:43 +08:00
    在用 FastRoute
    likezun
        3
    likezun  
       2016-07-02 23:09:48 +08:00
    造轮子...
    kumakiti
        4
    kumakiti  
       2016-07-02 23:23:56 +08:00
    很棒,特别好的学习资料~
    fhefh
        5
    fhefh  
       2016-07-03 10:51:01 +08:00
    nice mark~~~
    102400
        7
    102400  
       2016-07-03 17:19:47 +08:00
    几乎所有这种形式的路由都是学习 Sinatra 的吧?
    sensui7
        8
    sensui7  
       2016-07-03 17:32:19 +08:00
    一楼的 symfony router,醉了,
    takashiki
        9
    takashiki  
    OP
       2016-07-03 17:54:55 +08:00   ❤️ 1
    @BMW
    @manhere
    @likezun
    @void1900

    之所以造这个轮子是因为在做十分迷你的项目的时候发现加个路由性能损耗就十分严重了,同样的机器跑 ab , fastroute 只有五六百的 qps ,有些更轻量的路由像 Macaw 也只有八百左右。
    muyege
        10
    muyege  
       2016-07-04 09:31:32 +08:00
    https://github.com/noahbuscher/Macaw
    一个文件就搞定了,目前能找到的最简单的了
    jinzhe
        11
    jinzhe  
       2016-07-04 14:13:05 +08:00
    真心不够优雅
    ichou
        12
    ichou  
       2016-07-05 09:15:42 +08:00 via iPhone
    没有实现通配符而使用正则来写路由规则的话,代码可读性不忍直视
    JiaFeiX
        13
    JiaFeiX  
       2016-07-05 09:56:05 +08:00 via iPhone
    要性能的话,不是写在 nginx 层面来实现吗?
    pangliang
        14
    pangliang  
       2016-07-07 15:48:15 +08:00
    真正简单的就是:"约定大于配置"
    pangliang
        15
    pangliang  
       2016-07-07 16:16:00 +08:00
    盲写一个:

    list($_,$cls,$func)=explode("/",$_SERVER['REQUEST_URI'],3);
    include_once($cls.".php");

    $obj=new $cls();
    $obj->$func($_REQUEST);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1185 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:19 · PVG 07:19 · LAX 16:19 · JFK 19:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.