0

初期化中に UrlManager にロードするルート ルール ((1000+)) を含むルート テーブルがあります。しかし、ボトルネックは 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;
4

1 に答える 1

1

あなたは冗談ですか?Yiiの決定的なガイドを読んだことがありますか。彼らは、リクエストを解析している間、urlManagerルールの各ルールが一致するルールが見つかるまでリクエストURLに適用されることを明確に述べています。memcache内のすべてのルールの読み込みは機能しません。
この場合も、これらのルールは、それ自体が高価なコードである正規表現の助けを借りて一致します。単一のルールが複数のURLと一致するように、ルールを書き直してみてください。それらのいくつかを.htaccessに移動してみてください(アクションやリダイレクトが欠落している場合)

于 2012-06-19T14:18:27.893 に答える