2017-04-21 1 views
0

In config.php habe ichYü 1.1 urlManager Methode ParseURL läuft zweimal

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

In UrlManager.php habe ich

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

Wenn ich offen Seite versuche ich sehen zwei Cookies durch setcookie(microtime(true),date('H:i:s'),strtotime('+10 minutes')); produziert wurde ich erwarten Es gibt nur einen Keks.

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

Es bedeutet, dass Methode parseUrl zweimal ausgeführt wird. Aber warum? Ist es normales Verhalten oder kann ich es vermeiden?

Ich fand nur dieses Thema http://www.yiiframework.com/forum/index.php/topic/3558-url-manager-causes-page-to-load-twice/ aber ohne Entscheidung.


-Update 1.

habe ich var_dump('_',Yii::app()->request); und bemerkte, dass erste Ausgabe

private '_cookies' (CHttpRequest) => null 

als zweiter Ausgang hat

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

Nun, wenn es zweimal ausgeführt wurde, wurde es zweimal aufgerufen. Sie sollten $ _SERVER bei den beiden Anfragen protokollieren und vergleichen. Was ist der Unterschied? Könnte JS/CSS/iframe, etc. sein, was zur URL-Analyse führte. – szako

+0

Ich habe zur Funktion hinzugefügt parseUrl setcookie (Mikrozeit (true), Datum ('H: i: s'), strtotime ('+ 10 Minuten')); var_dump ('_', $ _ SERVER); return Elternteil :: parseUrl ($ Anfrage); Aber machte es nicht klar. $ _SERVER wird zweimal ausgegeben. Irgendwann gibt es Unterschiede, manchmal nicht. In meinem lokalen nginx differnece 'HTTP_PRAGMA' => string 'no-cache' 'HTTP_CACHE_CONTROL' => string 'no-cache' In meinem lokalen Apache 'HTTP_CACHE_CONTROL' => string ‚max-age = 0 ' Es gibt keinen Unterschied in meiner Remote-Entwicklerumgebung mit Nginx. Das Problem ist also noch offen. – venoel

+0

Sie meinen es wird zweimal in einer Anfrage ausgegeben? Und wenn es einen Unterschied gibt, was ist es? Liegt das Problem sowohl lokal als auch remote vor? Versuchen Sie, [backtrace] (http://php.net/manual/en/function.debug-backtrace.php) Unterschiede zu überprüfen. Debugging wäre besser, wenn Sie können. – szako

Antwort

0

Via kommentiert wurde die Ursache untersucht hat . Die parseUrl wird mehrmals aufgerufen, weil Sie später im Programmablauf eine zusätzliche parseUrl aufrufen müssen.

Verwenden Sie eine user parameter für die Steuerung der Cookie-Einstellung, zum Beispiel nennen Sie es "CookieSet" oder etwas anderes, das Ihren Bedürfnissen entspricht. Sobald parseUrl() ausgeführt wurde, können Sie es auf '1' oder 'wahr' setzen und im zweiten Lauf können Sie es überspringen, indem Sie den Parameter überprüfen. Auf diese Weise läuft die Cookie-Einstellung nur einmal in einem Aufruf.

+0

Danke für die Hilfe. – venoel