2017-04-21 24 views
0

config.phpYii的1.1 UrlManager方法的parseURL运行两次

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

UrlManager.php

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

当我尝试打开网页我看饼干被setcookie(microtime(true),date('H:i:s'),strtotime('+10 minutes')); 我希望制作只会有一个cookie。

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

这意味着方法parseUrl运行两次。但为什么?这是正常行为还是我可以避免它?

我发现这个话题http://www.yiiframework.com/forum/index.php/topic/3558-url-manager-causes-page-to-load-twice/但没有desicion。


更新1

我加入var_dump('_',Yii::app()->request);,发现 第一输出有

private '_cookies' (CHttpRequest) => null 

为第二输出具有

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

那么如果它运行了两次,它被称为两次。您应该在两个请求上记录$ _SERVER并进行比较。有什么不同?可能是JS/CSS/iframe等调用哪个导致URL解析。 – szako

+0

我已添加到功能parseUrl setcookie(microtime(true),date('H:i:s'),strtotime('+ 10 minutes')); var_dump('_',$ _ SERVER); return parent :: parseUrl($ request); 但没有说清楚。 $ _SERVER输出两次。有时候会有差异,有时候不会。 在我的本地nginx的差异性 “HTTP_PRAGMA” =>字符串“无缓存” “HTTP_CACHE_CONTROL” =>字符串“无缓存” 在我的本地阿帕奇 “HTTP_CACHE_CONTROL” =>字符串“最大年龄= 0 ' 我的远程开发环境与nginx没有区别。所以问题仍然存在。 – venoel

+0

你的意思是它在一次请求中输出两次?如果有什么不同,它是什么?问题是否存在于本地和远程?尝试检查[backtrace](http://php.net/manual/en/function.debug-backtrace.php)的差异。如果可以的话,调试会更好。 – szako

回答

0

通过评论的原因进行了检查。 parseUrl被多次调用,因为您在程序流程中稍后调用了一个额外的parseUrl。

使用user parameter来控制cookie设置,例如将其命名为'CookieSet'或其他任何适合您需要的名称。一旦parseUrl()运行,您可以将其设置为'1'或true,并且在第二次运行中您可以跳过它检查参数。通过这种方式,cookie设置只能在一次调用中运行一次。

+0

谢谢帮助。 – venoel