僅使用 Memcached 驅動程式重新產生會話 ID 時 CodeIgniter 3 會話遺失
P粉356361722
P粉356361722 2023-08-31 17:14:45
0
2
526
<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>
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學習者快速成長!