在config.php
我Yii的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
那么如果它运行了两次,它被称为两次。您应该在两个请求上记录$ _SERVER并进行比较。有什么不同?可能是JS/CSS/iframe等调用哪个导致URL解析。 – szako
我已添加到功能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
你的意思是它在一次请求中输出两次?如果有什么不同,它是什么?问题是否存在于本地和远程?尝试检查[backtrace](http://php.net/manual/en/function.debug-backtrace.php)的差异。如果可以的话,调试会更好。 – szako