僅使用 Memcached 驅動程式重新產生會話 ID 時 CodeIgniter 3 會話遺失
P粉356361722
P粉356361722 2023-08-31 17:14:45
0
2
448

我正在使用 CodeIgniter 3 框架開發一個長期運作的專案。幾個月來,我們一直遇到會話隨機丟失的問題。我已將框架檔更新至最新版本(3.1.13)。看起來這解決了開發伺服器上的問題,但在生產中它仍然存在。但我注意到現在只有當回應發送新的會話 cookie 時才會發生這種情況,這會在重新產生會話 id 時發生。當我更改 $config['sess_time_to_update'] 時,它會正確反映所需的時間。

開發伺服器與生產伺服器之間的差異在於會話驅動程式 - 它是開發伺服器上的文件,而在生產環境中我們使用 memcached。所以我做了一個實驗,將驅動程式切換到文件,會話不再丟失。我還嘗試使用 Redis 驅動程式進行設置,也沒有引起問題。所以肯定是Memcached驅動的問題。但我不想換另一個。日誌中沒有錯誤。我還檢查了 php.ini 檔案和 memcached 變數都是預設值。

CodeIgniter v3.1.13、PHP 7.4.3、適用於 Memcached 的 Amazon ElastiCache

這是設定:

$config['sess_driver'] = 'memcached'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 14400; $config['sess_save_path'] = 'host.com:11211'; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300; $config['sess_regenerate_destroy'] = FALSE;

任何在哪裡查看或檢查什麼內容的想法將不勝感激。

P粉356361722
P粉356361722

全部回覆 (2)
P粉797855790

查看此答案。顯然,如果您將會話的最大過期時間設定為大於memcached的過期限制,則可能會出現此問題。在那篇文章中,OP 透過修復以下配置變數解決了這個問題,您可以嘗試:

define('SESSION_TIME_OUT', x); ini_set('session.gc_maxlifetime', SESSION_TIME_OUT); ini_set('session.cache_expire', SESSION_TIME_OUT); session_start();

另一種選擇是刪除memcached並使用內存駐留sqlite3數據庫來代替會話存儲,我認為生產環境上的性能不會有太大不同在這兩種情況下。

    P粉762730205

    如果您使用的是 AWS ElastiCache Memcached 集群,請檢查您在配置中使用的終端節點$config['sess_save_path']。一種選擇是使用配置端點(其中包含.cfg.),另一個選項是單一節點端點(包含.0001..0002.等)。如果您使用設定終端節點,請確保啟用了自動發現(需要在伺服器上進行額外安裝 -適用於 PHP 的 ElastiCache 叢集用戶端)。如果不啟用,您的節點將無法正確解析,從而導致此類問題。

    事實證明我就是這種情況。我嘗試在會話startregeneratedestroy上記錄訊息,並且使用檔案驅動程式會發生重新生成,而使用memcached 時它甚至不會調用除session_start()之外的任何函數。經過一番調查後,我決定重新檢查主機並偶然發現這個AWS 中的指南。事實證明,在問題開始時,第二個節點已添加到我們的 Memcached 叢集中,但我們一直在使用配置端點,而沒有設定此自動發現。我根本不確定設定是如何工作的。因此,我將$config['sess_save_path']更改為其中一個節點的端點,問題就消失了。在我安裝和設定所需的模組之前,並且在節點未更改的情況下,此解決方案應該有效。

      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!