【问题标题】:Zend_Session and Zend_Log _Db are both writing to the database twice for every page loadZend_Session 和 Zend_Log _Db 每次页面加载都会向数据库写入两次
【发布时间】:2011-02-03 17:44:12
【问题描述】:

网络上散布着很多类似问题的例子,但他们的解决方案似乎都没有解决这个特殊的变化。任何建议,将不胜感激。

通常会出现此问题,因为恶意链接导致对诸如 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_Registry 对象传递,另一个在 indexAction 本地传递——只有会话变量增加 2。Apache 访问日志显示正确的数量的请求从页面加载中触发,并且所有请求都具有 200 或 304(未更改)的良好响应代码。

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

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

【问题讨论】:

    标签: model-view-controller zend-framework zend-db zend-session zend-log


    【解决方案1】:

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

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

    希望对遇到同样问题的人有所帮助。

    【讨论】:

      【解决方案2】:

      Google Chrome 总是通过向服务器发出烦人的请求来请求 favicon.ico。在 Chrome 中注意这一点。

      更多信息:

      http://framework.zend.com/issues/browse/ZF-11502?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#issue-tabs

      感谢 Sebastian Galenski 的贡献。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 2018-05-08
        相关资源
        最近更新 更多