0

有很多类似的问题的例子围绕网络散布,但他们的解决方案似乎没有解决这个特定的变化。任何建议,将不胜感激。Zend_Session和Zend_Log _Db都为每个页面加载写入数据库两次

通常会出现此问题,因为非法链接正在导致对像favicon或css文件这样的资源的请求多次触发调度程序,从而导致多个调度过程并因此导致数据库中有多行。

我检查过这个非常简单的示例页面上的所有链接都确实解析为它们指向的资源。

会话处理器的设置如下:

Zend_Db_Table_Abstract::setDefaultAdapter($db); 
Zend_Session::setSaveHandler(new 
      Zend_Session_SaveHandler_DbTable($config->session->toArray())); 

的DB的日志记录的设置如下:

$writer = new Zend_Log_Writer_Db($db, $config->log->tableName, 
      $config->log->columnMap->toArray()); 
$logger = new Zend_Log($writer); 

这两个对象是正确的设置,可以读取和写入,并从数据库中。只有一切发生两次。如果我在应用程序中的任何位置放置测试日志消息,它将被写入数据库两次。如果每次调用索引操作时增加三个变量 - 一个存储在会话中,一个通过Zend_Registry对象传递,另一个本地传递给indexAction - 只有会话变量增加2. Apache访问日志显示正确的数量的来自页面加载的请求被触发,并且全部具有200或304(不变)的良好响应代码。

我试过禁用所有头部链接。 我已经尝试完全禁用布局。 我已将本地化的所有内容都发送到调度程序,并在调度运行之前退出。

在所有情况下都会发生额外的写/增量。 有什么想法? 在此先感谢您的帮助。

回答

1

我似乎已经找到并解决了这个问题。 Chrome浏览器(可能还有所有Webkit浏览器)会在GET之上发出额外的HEAD请求,这意味着该应用程序会被点击两次,并且由于这两个请求都会触发基于会话的任何会话。我的临时解决方案是将下面的代码放在我的index.php文件的开头附近。

if ("HEAD" == $_SERVER['REQUEST_METHOD']) { 
    exit; 
} 

我希望能帮助有同样问题的人。