簡體   English   中英

Codeigniter 3升級會話鎖定導致問題

[英]Codeigniter 3 upgrade session lock causing issues

我們最近已將舊的Codeigniter應用程序從2.1.0升級到3.1.9,一切進展順利。 除此之外,新的會話鎖定會引起問題,我想知道修復它的正確方法。

該應用程序大量使用AJAX,但是大多數AJAX調用不會寫入會話,並且似乎也不會中斷會話。

這是一個問題的示例:存在一個帶有復選框的GUI,並且當更改輸入(選中或取消選中復選框)時,將進行AJAX調用。 在該AJAX呼叫的另一端,將選中了復選框的會話寫入會話,以便每次訪問時都能記住它們。 但是,如果您選中/取消選中多個框而導致多個AJAX呼叫中斷,則最終將被注銷。 在所有正在執行會話寫操作的應用程序周圍都發現了類似的行為。

我嘗試按照Codeigniter文檔的建議實施session_write_close() ,但是只有一半在某些地方有效,並且在以前沒有問題的區域中引起了更多問題。 該應用程序具有幾個可以完成所有工作且所有工作流都共享的端點,因此使用session_write_close()修復會話寫入發生的端點時,當它們繼續需要會話時,會中斷其他腳本調用。

我想出的短期解決方案是對AJAX調用進行反跳(這有助於但不能單獨解決問題),並禁用輸入,直到AJAX調用完成。

有更好的長期解決方案嗎? 最終,該應用已被淘汰,因此花很長時間重寫它是不可行的。

唯一的長期解決方案是正確使用session_write_close()

毫無疑問,會話數據已鎖定,因此在任何時候只有一個腳本可以寫入會話的持久性數據存儲。 會話鎖定可防止對並發錯誤進行故障排除,並且更加安全。

如果沒有看到您的實現,這真的很難,呃……無法提供任何准確的建議。 這里有一些需要考慮的事情可能有助於弄清混亂。

無論是做所有或會話沒有在AJAX響應函數寫。 (通過“ AJAX響應功能”,我指的是AJAX網址的PHP controller/method值。)

使用ALL方法,在發出任何AJAX請求之前,請在“主要”腳本中調用session_write_close() 請記住, $_SESSION不受session_write_close()影響。 腳本中的所有$_SESSION項都將保持可訪問狀態,因此您可以可靠地讀取值。 但是,將不會寫入對$_SESSION所做的更改 ,因為就PHP而言,該會話已關閉。 但這僅適用於調用session_write_close()的腳本。

使用NONE方法,您可能仍需要讀取會話數據。 在那種情況下,最好讓AJAX響應函數盡快調用session_write_close ,以最大程度地減少並發請求被阻塞的時間。 對於需要大量時間才能執行的功能,該調用更為重要。 如果腳本執行時間很短,則不需要顯式調用session_write_close() 如果有可能,即無需讀取會話數據,則不加載session類可能會導致代碼更簡潔。 肯定會消除並發請求阻塞的任何機會。

不要嘗試通過在同一瀏覽器上使用多個選項卡來測試同一應用程序來測試會話行為。

考慮使用$config['sess_time_to_update'] = 0; 然后顯式調用$this->sess_regenerate((bool) config_item('sess_regenerate_destroy')); 需要更改會話ID的時間和地點,即登錄后立即更改; 重定向到“敏感”頁面后; 等等

接下來的內容帶有大量的恐懼。 我已經使用“文件”驅動程序對此進行了測試,但是還沒有進行廣泛的測試。 因此,買家要當心。

我發現這是可能的“重新啟動”會話通過調用PHP函數session_start()之后session_write_close()已被使用。 CodeIgniter將打開並讀取會話數據存儲,並重建$_SESSION超全局變量。 現在可以更改會話數據,它將在腳本執行結束時寫入-或通過另一個對session_write_close()調用來寫入。

這是有道理的,因為session_write_close()不會對CodeIgniter session對象執行任何操作。 該類仍被實例化和配置。 CodeIgniter的自定義SessionHandlerInterface用於在調用session_start()之后打開,讀取和寫入會話數據。

也許這種明顯的功能可以用來解決您的問題。 如果我之前不清楚,請自擔風險!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM