僅使用 Memcached 驅動程式重新產生會話 ID 時 CodeIgniter 3 會話遺失
P粉356361722
2023-08-31 17:14:45
<p>我正在使用 CodeIgniter 3 框架開發一個長期運作的專案。幾個月來,我們一直遇到會話隨機丟失的問題。我已將框架檔更新至最新版本(3.1.13)。看起來這解決了開發伺服器上的問題,但在生產中它仍然存在。但我注意到現在只有當回應發送新的會話 cookie 時才會發生這種情況,這會在重新產生會話 id 時發生。當我更改 <code>$config['sess_time_to_update']</code> 時,它會正確反映所需的時間。 </p>
<p>開發伺服器與生產伺服器之間的差異在於會話驅動程式 - 它是開發伺服器上的文件,而在生產環境中我們使用 memcached。所以我做了一個實驗,將驅動程式切換到文件,會話不再丟失。我還嘗試使用 Redis 驅動程式進行設置,也沒有引起問題。所以肯定是Memcached驅動的問題。但我不想換另一個。日誌中沒有錯誤。我還檢查了 php.ini 檔案和 memcached 變數都是預設值。 </p>
<p>CodeIgniter v3.1.13、PHP 7.4.3、適用於 Memcached 的 Amazon ElastiCache</p>
<p>這是設定:</p>
<pre class="brush:php;toolbar:false;">$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;</pre>
<p>任何在哪裡查看或檢查什麼內容的想法將不勝感激。 </p>
查看此答案。顯然,如果您將會話的最大過期時間設定為大於memcached的過期限制,則可能會出現此問題。在那篇文章中,OP 透過修復以下配置變數解決了這個問題,您可以嘗試:
另一種選擇是刪除
memcached
並使用內存駐留sqlite3
數據庫來代替會話存儲,我認為生產環境上的性能不會有太大不同在這兩種情況下。如果您使用的是 AWS ElastiCache Memcached 集群,請檢查您在配置中使用的終端節點
$config['sess_save_path']
。一種選擇是使用配置端點(其中包含.cfg.
),另一個選項是單一節點端點(包含.0001.
、.0002.
等)。如果您使用設定終端節點,請確保啟用了自動發現(需要在伺服器上進行額外安裝 - 適用於 PHP 的 ElastiCache 叢集用戶端)。如果不啟用,您的節點將無法正確解析,從而導致此類問題。事實證明我就是這種情況。我嘗試在會話start、regenerate 和destroy 上記錄訊息,並且使用檔案驅動程式會發生重新生成,而使用memcached 時它甚至不會調用除
session_start()
之外的任何函數。經過一番調查後,我決定重新檢查主機並偶然發現 這個AWS 中的指南。事實證明,在問題開始時,第二個節點已添加到我們的 Memcached 叢集中,但我們一直在使用配置端點,而沒有設定此 自動發現。我根本不確定設定是如何工作的。因此,我將$config['sess_save_path']
更改為其中一個節點的端點,問題就消失了。在我安裝和設定所需的模組之前,並且在節點未更改的情況下,此解決方案應該有效。