0

我有带有路由规则((1000+))的路由表,可以在初始化时加载到 UrlManager。但是瓶颈是foreach循环,太慢了。

可能的答案:NoSQL 数据库、内存缓存?你能给点建议吗?

    $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;
4

1 回答 1

1

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

于 2012-06-19T14:18:27.893 回答