2012-06-19 4 views
0

У меня есть таблица маршрута с правилами маршрута ((1000+)) для загрузки в UrlManager во время init. Но узким местом является цикл foreach, который слишком медленный.Yii-framework UrlManager perfomance

Возможные ответы: база данных 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

Вы Джокс? вы прочитали окончательное руководство Yii. Они ясно упомянули, что при разборе запроса каждое правило в правилах urlManager применяется к URL-адресу запроса до тех пор, пока не будет найдено правило соответствия. Загрузка всех правил в memcache не будет работать.
Снова эти правила сопоставляются с помощью регулярных выражений, которые сами по себе являются дорогостоящим кодом. Я бы сказал, попробуйте переписать свои правила, чтобы одно правило совпадало с несколькими URL-адресами. попробуйте переместить некоторые из них в .htaccess (для отсутствующих действий или перенаправления)

+0

Благодарим за ваше мнение. В db есть 1000+ объектов недвижимости (REO), и для каждого REO хранится уникальный uri в таблице «route». –

+0

Например: http://www.site.com/any_user_given_uri.html сопоставляется с квартирой/видом/id/1 http://www.site.com/any_user_given_uri1.html сопоставляется с квартирой/видом/id/2 http://www.site.com/any_user_given_uri2.html сопоставлен с квартирой/списком Я хочу, чтобы пользователь мог установить uri для любого REO самостоятельно. –

+1

У меня около 10 тыс. REOs в моем db. но правила URL равны 7. Это не главное. вы можете написать одно правило для первых двух URL-адресов, перечисленных. as ''/ .html '=>' apartment/view/''теперь в действии admin view вы получите' $ term' из '$ _GET [' term ']' и получите свой идентификатор от '$ term'. Во-вторых, это хорошая идея, но вы всегда должны пытаться добавить некоторые ограничения, как в случае третьего uri, вы не позволяете пользователю использовать слова 'any_user_given_uri' в uri, поскольку он используется для указания на REO или REO id. Я бы посоветовал ознакомиться с специальными темами управления URL-адресами в Yii окончательном руководстве. –