2014-02-06 92 views
2

所以我使用codeigniter作爲我們的內部Intranet。Codeigniter會話掛起

通常在做數據庫選擇,更新,刪除等操作時,我使用ajax,並使用jquery更新頁面而不重定向。

我需要實際提交表單而不是依賴ajax。數據庫操作完成後,我使用codeigniters會話設置一些會話數據,然後將用戶重定向到概覽頁面,在此頁面將從會話中檢索信息並將其顯示爲「成功」消息。

我可以設置數據就好了:

$this->session->set_userdata('msg_title', 'Success'); 
$this->session->set_userdata('msg_content', 'Some success message here'); 

我也知道我應該使用flashdata像這樣的例子,但似乎是一個錯誤。

當我使用flashdata設置數據,或者當我嘗試使用unset_userdata()取消設置userdata時,瀏覽器掛起。

我知道它的這兩個功能,因爲當我刪除set_flashdata()unset_userdata()行時,腳本工作正常。

沒有錯誤,錯誤日誌中沒有條目,控制檯日誌中沒有任何條目。同一臺服務器上的其他網站(子域名)工作正常。它只有當我使用這些功能時,它似乎掛起瀏覽器。

我使用Chrome 32.0.1700.107,我也在IE8中測試過它,它遇到了同樣的問題。

我已經發布的下面的代碼的相關章節:

body.php - 我的視圖

<?php if($this->session->userdata('msg_reply')): ?> 
    <p class="big-message <?php echo $this->session->userdata('msg_colour_class'); ?>"> 
     <strong><?php echo $this->session->userdata('msg_title'); ?></strong><br> 
     <?php echo $this->session->userdata('msg_message'); ?></strong> 
    </p> 

    <?php 
     $this->session->unset_userdata('msg_reply'); 
     $this->session->unset_userdata('msg_colour_class'); 
     $this->session->unset_userdata('msg_title'); 
     $this->session->unset_userdata('msg_message'); 
    ?> 

<?php endif; ?> 

我的控制器

$this->session->set_userdata(array(
    'msg_reply' => true, 
    'msg_colour_class' => 'green-gradient', 
    'msg_title' => 'Contacts Updated', 
    'msg_message' => 'You have successfully updated ' . $i . ' out of ' . $t . ' contacts.' 
)); 

redirect('my_department/student_absence'); 

摘要:

  1. 我知道我應該使用set_flashdata(),不過這個功能懸掛在瀏覽器
  2. set_userdata()工作正常,並在會議
  3. unset_userdata()創建值掛瀏覽器
  4. 沒有錯誤消息的任何地方。
  5. 刪除set_flashdata()unset_userdata()的實例可以解決問題,但也會阻止我能夠設置flashdata或刪除正常的會話數據。

編輯

我自動載入會議庫,它可爲每個頁面。 另外,試圖取消設置控制器中的會話數據會掛起瀏覽器。

在等待頁面完成加載後,我發現unset_userdata()正在工作,但其花費時間去做任何事情。

我已經運行了3次重載腳本,每次都需要2分鐘才能重新載入頁面。

+0

對不起,我忘了在帖子中提到這一點,我已經自動加載會話庫,因爲每個頁面都依賴會話來驗證用戶(它是一個封閉的內部敏感信息內部網)。 –

+0

好吧,它似乎正在工作,但需要2分鐘才能刪除會話數據。我已經使用Chrome開發人員工具檢查了這一點,然後從提交按鈕到完成加載的頁面,這需要2分鐘。除去'unset_userdata()'函數,這些頁面只需要3秒鐘。 –

+0

即使會話庫已經加載,$這沒有什麼可指向上面提到的,我很驚訝你沒有得到一個錯誤。無論如何,至於時間問題,我建議首先在控制器中管理會話。你嘗試過這條路線嗎? – Zarathuztra

回答

1

正如Hashem之前提到的那樣,使用多次調用會話管理方法會增加很多開銷。此外,請嘗試在控制器中管理會話而不是視圖。爲了訪問codeigniter對象,通常綁定到控制器和模型中的$ this上下文,您必須通過get_instance()獲取該對象的引用,這會增加額外的開銷。

也就是說,將會話管理移至控制器本身,無論如何應該這樣做。您應該在會話對象中設置並傳遞到視圖中的唯一東西是維護會話所需的數據,並提供乾淨的用戶體驗。

鑑於您似乎正在傳遞的消息,flashdata似乎是最合適的路線。所以,不要使用以下:

$this->session->set_userdata('msg_title', 'Success'); 
$this->session->set_userdata('msg_content', 'Some success message here'); 

應使用於下一個請求該

$this->session->set_flashdata('msg_title', 'Success'); 
$this->session->set_flashdata('msg_content', 'Some success message here'); 

閃存數據被清除,因此調用未設置是沒有必要的,減少開銷進一步。只有那些應該在整個用戶會話中持續存在的項目應該使用set_userdata()

請讓我知道如果您需要其他信息或者如果有什麼不清楚的地方,我會很樂意更新答案。