2017-04-21 4 views
0

En config.php jeYii 1.1 Méthode urlManager parseURL fonctionne deux fois

'urlManager'=>array(
    'class'=>'UrlManager', 
... 

En UrlManager.php je

class UrlManager extends CUrlManager 
{ 
    public function parseUrl($request) 
    { 
     ... 
     setcookie(microtime(true),date('H:i:s'),strtotime('+10 minutes')); 
     return parent::parseUrl($request); 
    } 
} 

Lorsque je tente la page ouverte, je vois deux biscuits a été produit par setcookie(microtime(true),date('H:i:s'),strtotime('+10 minutes')); Je me attends il y aurait un seul cookie.

492786392.9662 17%3A53%3A12 // first cookie 
1492786392.9704 17%3A53%3A12 // second cookie 

Cela signifie méthode parseUrl fonctionne deux fois. Mais pourquoi? Est-ce normal ou est-ce que je peux l'éviter?

J'ai trouvé ce sujet http://www.yiiframework.com/forum/index.php/topic/3558-url-manager-causes-page-to-load-twice/ mais sans dessication.


Update 1.

J'ai ajouté var_dump('_',Yii::app()->request); et a remarqué que première sortie a

private '_cookies' (CHttpRequest) => null 

en tant que deuxième sortie a

object(HttpRequest)[2982] 
... 
object(CCookieCollection)[3044] 
    private '_request' => 
    &object(HttpRequest)[2982] 
    private '_initialized' => boolean true 
    private '_d' (CMap) => 
    array (size=1) 
     'YII_CSRF_TOKEN' => 
     object(CHttpCookie)[3043] 
      public 'name' => string 'YII_CSRF_TOKEN' (length=14) 
      public 'value' => string 'b78823914a0bb40b65093636b55687e683cf289f' (length=40) 
      public 'domain' => string '' (length=0) 
      public 'expire' => int 0 
      public 'path' => string '/' (length=1) 
      public 'secure' => boolean false 
      public 'httpOnly' => boolean false 
      private '_e' (CComponent) => null 
      private '_m' (CComponent) => null 
    private '_r' (CMap) => boolean false 
    private '_e' (CComponent) => null 
    private '_m' (CComponent) => null 
+0

Bien s'il a été lancé deux fois, il a été appelé deux fois. Vous devez enregistrer $ _SERVER sur les deux requêtes et le comparer. Quelle est la différence? Peut être JS/CSS/iframe, etc appel qui a conduit à l'analyse d'URL. – szako

+0

J'ai ajouté à la fonction parseUrl setcookie (microtime (vrai), date ('H: i: s'), strtotime ('+ 10 minutes')); var_dump ('_', $ _ SERVER); retourne parent :: parseUrl ($ request); Mais n'a pas été clair. $ _SERVER sort deux fois. Il y a parfois une différence, parfois non. Dans mon nginx locale differnece 'HTTP_PRAGMA' => string 'no-cache' 'HTTP_CACHE_CONTROL' => string 'no-cache' Dans mon apache locale 'HTTP_CACHE_CONTROL' => string « max-age = 0 ' Il n'y a pas de différence dans mon environnement de développement distant avec nginx. Donc, le problème est toujours ouvert. – venoel

+0

Vous voulez dire qu'il est sorti deux fois en une seule requête? Et s'il y a une différence, qu'est-ce que c'est? Le problème existe-t-il à la fois localement et à distance? Essayez de vérifier les différences [backtrace] (http://php.net/manual/fr/function.debug-backtrace.php). Déboguer serait mieux si vous le pouvez. – szako

Répondre

0

via les commentaires la cause a été examinée . Le parseUrl est appelé plusieurs fois car vous avez un appel parseUrl supplémentaire plus tard dans le flux du programme.

Utilisez un code user parameter pour contrôler le paramètre de cookie, par exemple, nommez-le «cookieSet» ou tout autre élément correspondant à vos besoins. Une fois que le parseUrl() a fonctionné, vous pouvez le mettre à '1' ou vrai et le dans la deuxième course, vous pouvez l'ignorer en vérifiant le paramètre. De cette façon, le réglage des cookies ne s'exécute qu'une fois dans un appel.

+0

Merci pour aider. – venoel