Zend_Session и Zend_Log _Db пишут в базу данных дважды для каждой загрузки страницы - PullRequest
0 голосов
/ 03 февраля 2011

В сети есть множество примеров подобных проблем, но ни одно из их решений, похоже, не исправляет этот конкретный вариант. Мы ценим любые предложения.

Обычно эта проблема возникает из-за того, что мошенническая ссылка приводит к тому, что запрос ресурсов типа файла 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 (без изменений).

Я попытался отключить все ссылки на заголовки. Я попытался отключить макет полностью. Я локализовал все для диспетчера и вышел перед запуском диспетчеризации.

Во всех случаях происходит дополнительная запись / приращение. Какие-нибудь мысли? Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Кажется, я нашел и исправил проблему.Chrome (и, возможно, все браузеры Webkit) выдает дополнительный запрос HEAD поверх GET, что означает, что к приложению обращаются дважды, и любой результат на основе сеанса будет запущен в результате обоих запросов.Мое временное решение состоит в том, чтобы поместить следующий код в начало моего файла index.php.

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

Надеюсь, это поможет кому-то с такой же проблемой.

0 голосов
/ 29 ноября 2011

Google Chrome всегда запрашивает favicon.ico , отправляя раздражающие запросы на сервер. Позаботьтесь об этом в Chrome.

Для получения дополнительной информации:

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

Благодаря вкладу Себастьяна Галенского.

...