Yii-框架UrlManager性能

时间:2012-06-19 14:03:39

标签: performance yii url-routing

我有路由表和路由规则((1000+))在init时加载到UrlManager。 但瓶颈是foreach周期,这太慢了。

可能的答案:NoSQL数据库,memcache?你能建议吗?

    $oldRules = $this->rules;
    $this->rules = array();
    $dependency = new CDbCacheDependency('SELECT MAX(created_at) FROM route');
    $routes = Route::model()->cache(Yii::app()->params['cache_expire_time'], $dependency)->findAll();

    Yii::app()->cache->set('routes', $routes, Yii::app()->params['cache_expire_time'], $dependency);

    // @todo Bottle neck on 1000+ rows (~1.3s on 1000 rows)
    foreach ($routes as $route) {
        $rule = array($route->routeable_controller . '/' . $route->routeable_action);
        if ($route->routeable_id) {
            $rule['defaultParams'] = array('id' => $route->routeable_id);
        }
        $this->rules[$route->pattern] = $rule;
    }

    $this->rules += $oldRules;

1 个答案:

答案 0 :(得分:1)

你是运动员吗?你读过Yii权威指南吗?他们清楚地提到,在解析请求时,urlManager规则中的每个规则都应用于请求URL,直到找到匹配规则。在memcache中加载所有规则是行不通的 同样,这些规则与正则表达式的帮助相匹配,正则表达式本身就是一个昂贵的代码。 我会说尝试重写您的规则,以便单个规则与多个网址匹配。尝试在.htaccess中移动其中一些(用于丢失操作或重定向)