Memcached 드라이버만 사용하여 세션 ID를 다시 생성할 때 CodeIgniter 3 세션이 손실됨
P粉356361722
P粉356361722 2023-08-31 17:14:45
0
2
545
<p>저는 CodeIgniter 3 프레임워크를 사용하여 장기 실행 프로젝트를 개발하고 있습니다. 몇 달 동안 세션이 무작위로 손실되는 문제가 발생했습니다. 프레임워크 파일을 최신 버전(3.1.13)으로 업데이트했습니다. 이로 인해 개발 서버의 문제가 해결된 것처럼 보이지만 프로덕션 환경에서는 여전히 문제가 존재합니다. 그러나 이제 이 문제는 응답이 새 세션 쿠키를 보낼 때만 발생하며, 이는 세션 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'] = 거짓; $config['sess_time_to_update'] = 300; $config['sess_regenerate_destroy'] = 거짓;</pre> <p>어디를 봐야 할지, 무엇을 확인해야 할지 알려주시면 감사하겠습니다. </p>
P粉356361722
P粉356361722

모든 응답(2)
P粉797855790

이 답변을 확인하세요. 분명히 이 문제는 세션의 최대 만료 시간을 memcached의 만료 제한보다 크게 설정하면 발생할 수 있습니다. 해당 게시물에서 OP는 다음 구성 변수를 수정하여 문제를 해결했습니다. 시도해 볼 수 있습니다.

으아악

또 다른 옵션은 memcached 并使用内存驻留 sqlite3 데이터베이스를 제거하고 이를 세션 저장소로 교체하는 것입니다. 두 경우 모두 프로덕션 성능이 크게 다르지 않을 것이라고 생각합니다.

P粉762730205

AWS ElastiCache Memcached 클러스터를 사용하는 경우 구성에서 사용 중인 엔드포인트를 확인하세요$config['sess_save_path']。一种选择是使用配置端点(其中包含 .cfg.),另一种选项是单个节点端点(包含 .0001..0002. 등). 구성 엔드포인트를 사용하는 경우 자동 검색이 활성화되어 있는지 확인하세요(서버에 추가 설치 필요 - PHP용 ElastiCache 클러스터 클라이언트). 활성화하지 않으면 노드가 올바르게 해결되지 않아 이와 같은 문제가 발생합니다.

나도 그랬다는 사실이 밝혀졌다. 세션 start, regeneratedestroy에서 메시지 로깅을 시도했는데 파일 드라이버를 사용하면 재생성이 발생하는 반면 memcached를 사용하면 session_start() 함수 이외의 어떤 함수도 호출하지 않습니다. 이것 말고도 . 몇 가지 조사 끝에 호스트를 다시 확인하기로 결정했고 우연히 를 발견했습니다. AWS session_start() 之外的任何函数。经过一番调查后,我决定重新检查主机并偶然发现 这个AWS 中的指南。事实证明,在问题开始时,第二个节点已添加到我们的 Memcached 集群中,但我们一直在使用配置端点,而没有设置此 自动发现。我根本不确定设置是如何工作的。因此,我将 $config['sess_save_path'] 가이드. 문제가 시작되었을 때 두 번째 노드가 Memcached 클러스터에 추가되었지만 우리는 이 자동 검색

. 설정이 어떻게 작동하는지 잘 모르겠습니다. 그래서 $config['sess_save_path']를 노드 중 하나의 끝점으로 변경했더니 문제가 사라졌습니다. 이 솔루션은 필요한 모듈을 설치 및 설정할 때까지, 그리고 노드가 변경되지 않는 한 작동해야 합니다. 🎜
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿