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