Model view controller Zend_Session和Zend_Log_Db在每次页面加载时都会向数据库写入两次

Model view controller Zend_Session和Zend_Log_Db在每次页面加载时都会向数据库写入两次,model-view-controller,zend-framework,zend-db,zend-session,zend-log,Model View Controller,Zend Framework,Zend Db,Zend Session,Zend Log,网络上到处都是类似问题的例子,但他们的解决方案似乎都无法解决这种特殊的变化。如有任何建议,将不胜感激 通常出现此问题的原因是,恶意链接导致对favicon或css文件等资源的请求多次命中调度程序,从而导致多个调度进程,从而导致数据库中的多行 我已经检查了这个非常简单的示例页面上的所有链接是否确实解析为它们所指向的资源 会话处理程序的设置如下所示: Zend_Db_Table_Abstract::setDefaultAdapter($db); Zend_Session::setSaveHandle

网络上到处都是类似问题的例子,但他们的解决方案似乎都无法解决这种特殊的变化。如有任何建议,将不胜感激

通常出现此问题的原因是,恶意链接导致对favicon或css文件等资源的请求多次命中调度程序,从而导致多个调度进程,从而导致数据库中的多行

我已经检查了这个非常简单的示例页面上的所有链接是否确实解析为它们所指向的资源

会话处理程序的设置如下所示:

Zend_Db_Table_Abstract::setDefaultAdapter($db);
Zend_Session::setSaveHandler(new 
            Zend_Session_SaveHandler_DbTable($config->session->toArray()));
$writer = new Zend_Log_Writer_Db($db, $config->log->tableName, 
            $config->log->columnMap->toArray());
$logger = new Zend_Log($writer);
数据库日志记录的设置如下所示:

Zend_Db_Table_Abstract::setDefaultAdapter($db);
Zend_Session::setSaveHandler(new 
            Zend_Session_SaveHandler_DbTable($config->session->toArray()));
$writer = new Zend_Log_Writer_Db($db, $config->log->tableName, 
            $config->log->columnMap->toArray());
$logger = new Zend_Log($writer);
这两个对象都已正确设置,可以读取和写入数据库。每件事只会发生两次。如果我将测试日志消息放在应用程序中的任何位置,它将被写入数据库两次。如果每次调用index操作时增加三个变量——一个存储在会话中,一个通过Zend_注册表对象传递,另一个通过indexAction本地传递——则只有会话变量增加2。Apache访问日志显示了从页面加载中激发的请求的正确数量,并且所有请求都具有200或304(不变)的良好响应代码

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

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

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

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

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

谷歌浏览器总是通过向服务器发出恼人的请求来请求favicon.ico。在Chrome中注意这一点

有关更多信息:

感谢塞巴斯蒂安·加伦斯基的贡献