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; 
} 

我希望能幫助有同樣問題的人。