개발 Q&A

제목 redis session 설정 질문 드립니다
카테고리 PHP
글쓴이 worldwar3 작성시각 2022/02/17 17:17:48
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 9237   RSS

안녕하세요, 

이번에 database 세션에서 redis 세션으로 변경하려고 하는데

제대로 동작하지 않아서 질문 드립니다.

 

 

일단 개발환경은 redis의 경우 네이버 클라우드 플랫폼에서 제공하는 서버를 사용하고,

phpredis 설치해서 테스트 코드로 데이터 입력/출력 되는 것까지 브라우저/서버 양쪽에서 모니터링 성공했는데요,

 

 

config에 설정 적용한 뒤 세션이 유지가 되지않아 에러로그 찍어보니

system/libralies/Session.php에서 sess_write가 동작하면서 쿼리 문법 오류가 발생하더군요

(sess_table_name이 없어서 발생한 걸로 보입니다.)

 

데이터베이스는 작성하지 않으니 해당 동작 하지않게 $config['sess_use_database'] = FALSE;

로 적용했더니 쿠키만 작성하고 redis 서버는 조회하지 않았습니다.

 

redis 서버 접속이나 조회가 실패하는 건가 싶어서

system/libralies/Session/drivers/Session_redis_driver.php에 로그 찍어서 테스트 해봤는데

아무 로그도 안 찍히는 것을 보니 애초에 해당 드라이버를 사용하지 않는 걸로 보입니다.

 

현재 ci 상에선 config 설정을 아래처럼 했는데

서버나 ini 파일에서 추가적으로 redis를 사용하도록 수정이 필요한걸까요?

$config['sess_driver'] = 'redis';

$config['sess_cookie_name'] = 'redis_';

$config['sess_expiration'] = 7200;

$config['sess_save_path'] = 'tcp://my-naver-redis-server:6379';

$config['sess_use_database'] = FALSE;

$config['sess_match_ip'] = FALSE;

$config['sess_time_to_update'] = 300;

$config['sess_regenerate_destroy'] = FALSE;

$config['sess_expire_on_close'] = TRUE;

$config['sess_encrypt_cookie'] = TRUE;

$config['sess_match_useragent'] = FALSE;

 

제가 미처 고려하지 못한 부분 있으면 지적 부탁드립니다.

감사합니다.

 다음글 form_validation 질문드립니다!! (2)
 이전글 우분투 apache2+svn 쓰기권한 문제.. (1)

댓글

테러보이 / 2022/02/18 13:16:02 / 추천 0

tcp://my-naver-redis-server:6379?database=1(또는 이름)

으로 해보세요.

ci4에서는 일단 정상 작동되네요

tuyitu719 new / 2026/03/14 10:17:37 / 추천 0

안녕하세요.
이건 Redis 접속 자체의 문제라기보다, CI 세션 설정/라이브러리 버전이 섞여 있는 문제로 보는 게 더 맞아 보입니다. CodeIgniter 3의 세션 라이브러리는 CI2와 다르게 완전히 다시 작성되었고, 기본적으로 files / database / redis / memcached 드라이버를 지원합니다. CI3에서 핵심 설정은 sess_driver 와 sess_save_path 입니다. 반면 sess_use_database, sess_encrypt_cookie, sess_match_useragent 는 업그레이드 문서에서 제거 대상으로 안내되고, sess_expire_on_close 도 하위 호환용으로만 남겨두고 sess_expiration = 0 으로 대체하라고 되어 있습니다.

지금처럼 system/libraries/Session.php 의 sess_write() 쪽에서 SQL 문법 오류가 나고, sess_table_name 이 없어서 DB 세션처럼 동작하는 흔적이 보인다면, 실제로는 Redis 드라이버까지 가지 못하고 예전 세션 흐름을 타고 있는 것에 가깝습니다. CI3 업그레이드 문서에도 예전 sess_use_database 를 쓰던 프로젝트는 기본 드라이버가 database 로 잡히는 하위 호환 로직이 있고, database 드라이버는 sess_table_name fallback 을 사용한다고 나와 있습니다. 즉, 질문에 적으신 증상은 “Redis 서버가 안 붙는다”기보다 프로젝트가 아직 CI3 방식으로 완전히 정리되지 않았다는 신호에 더 가깝습니다.

그래서 결론부터 말씀드리면, 서버나 php.ini 에서 추가로 session.save_handler=redis 를 꼭 넣어야 하는 상황은 아닐 가능성이 큽니다. CI3는 원래 자체 Redis 세션 드라이버를 가지고 있고, php.ini 의 session.save_handler/session.save_path 설정은 CI 드라이버를 쓰지 않고 PHP 세션 핸들러로 우회할 때의 다른 방법입니다. 이미 CI3 자체가 Redis 세션 드라이버를 제공하므로, 현재 단계에서는 php.ini 보다 어떤 세션 라이브러리가 실제 로딩되고 있는지를 먼저 확인하는 게 우선입니다.

우선 설정은 최소한으로 아래처럼 정리해서 테스트해 보시는 걸 권합니다.

$config['sess_driver'] = 'redis';
$config['sess_cookie_name'] = 'redis_';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'tcp://my-naver-redis-server:6379';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

그리고 아래 값들은 일단 빼고 보시는 게 좋습니다.

// 제거 권장
// $config['sess_use_database'] = FALSE;
// $config['sess_encrypt_cookie'] = TRUE;
// $config['sess_match_useragent'] = FALSE;
// $config['sess_expire_on_close'] = TRUE;

이 값들은 CI3 기준으로는 제거되었거나 하위 호환용이라, 지금 같은 혼선을 만들 가능성이 있습니다. 특히 sess_use_database 는 CI2 시절 설정이라 Redis 전환 중에는 아예 빼는 편이 안전합니다.

실제로는 아래 4가지를 먼저 확인하시면 됩니다.
첫째, 프로젝트가 정말 CI3인지, 그리고 system/libraries/Session/drivers/Session_redis_driver.php 구조를 쓰는 상태인지 확인해 보세요. CI3는 세션 드라이버 구조가 system/libraries/Session/... 아래로 바뀌었습니다.
둘째, application/libraries/Session.php 나 MY_Session.php 처럼 예전 세션 라이브러리를 덮어쓰는 파일이 있는지 확인해 보세요. 질문에 적으신 로그만 보면 이 가능성이 꽤 있습니다.
셋째, 위 최소 설정으로 바꾼 뒤 $this->load->library('session'); $_SESSION['test']='1'; 정도만 넣고 Redis 키가 생기는지 확인해 보세요. CI3 세션은 PHP의 세션 메커니즘을 사용하므로 $_SESSION 으로도 확인이 됩니다.
넷째, 그 다음에도 Redis 드라이버에 아예 진입하지 않는다면, 현재 system/session 파일이 오래된 버전이거나 섞여 있을 가능성도 봐야 합니다. CI3의 Redis 세션 드라이버는 버전별로 phpredis 관련 수정 이력이 있었기 때문에, 구버전이면 최신 3.1.x 시스템 파일과 비교해 보는 것도 필요합니다.

한 줄로 정리하면,
지금 문제는 Redis 서버 접속보다 “CI2/CI3 세션 설정이 섞여서 Redis 드라이버가 아예 안 타는 상태”일 가능성이 가장 큽니다.
그래서 sess_use_database, sess_encrypt_cookie, sess_match_useragent, sess_expire_on_close 를 빼고, CI3 최소 설정으로 다시 테스트해 보시는 게 가장 빠른 해결 순서입니다.