173 lines
6.2 KiB
PHP
173 lines
6.2 KiB
PHP
<?php
|
|
|
|
namespace Config;
|
|
|
|
use CodeIgniter\Config\BaseConfig;
|
|
use CodeIgniter\Session\Handlers\BaseHandler;
|
|
use CodeIgniter\Session\Handlers\DatabaseHandler;
|
|
use CodeIgniter\Session\Handlers\RedisHandler;
|
|
|
|
class Session extends BaseConfig
|
|
{
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Session Driver
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* The session storage driver to use:
|
|
* - `CodeIgniter\Session\Handlers\DatabaseHandler`
|
|
* - `CodeIgniter\Session\Handlers\RedisHandler`
|
|
*
|
|
* @var class-string<BaseHandler>
|
|
*/
|
|
public string $driver = RedisHandler::class;
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Session Cookie Name
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* The session cookie name, must contain only [0-9a-z_-] characters
|
|
*/
|
|
public string $cookieName = 'ci_session';
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Session Expiration
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* The number of SECONDS you want the session to last.
|
|
* Setting to 0 (zero) means expire when the browser is closed.
|
|
*/
|
|
public int $expiration = 7200;
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Session Save Path
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* The location to save sessions to and is driver dependent.
|
|
*
|
|
* For the 'database' driver, it's a table name.
|
|
* For Redis: tcp://host:port?database=n&password=xxx
|
|
*
|
|
* IMPORTANT: You are REQUIRED to set a valid save path!
|
|
*/
|
|
public string $savePath;
|
|
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
|
|
// 환경변수로 강제로 Database 모드 설정 가능 (Redis 장애 시 수동 전환)
|
|
$forceDatabase = env('SESSION_FORCE_DATABASE', false);
|
|
|
|
// Redis 설정: Redis 연결 실패 시 Database로 폴백
|
|
if ($this->driver === RedisHandler::class && !$forceDatabase) {
|
|
helper('redis');
|
|
|
|
try {
|
|
// Redis 연결 테스트
|
|
$testRedis = get_redis_connection('session');
|
|
|
|
if (!$testRedis) {
|
|
throw new \Exception('Redis connection failed');
|
|
}
|
|
|
|
// Redis 정상 - Redis 설정 사용
|
|
$config = get_redis_config('session');
|
|
|
|
$this->savePath = sprintf(
|
|
'tcp://%s:%s?database=%s',
|
|
$config['host'],
|
|
$config['port'],
|
|
$config['database']
|
|
);
|
|
|
|
if (!empty($config['password'])) {
|
|
$this->savePath .= '&password=' . $config['password'];
|
|
}
|
|
|
|
} catch (\Exception $e) {
|
|
// Redis 실패 - DatabaseHandler로 폴백
|
|
log_message('warning', 'Session: Redis unavailable (' . $e->getMessage() . '), falling back to DatabaseHandler');
|
|
$this->driver = DatabaseHandler::class;
|
|
$this->savePath = 'ci_sessions'; // 테이블 이름
|
|
}
|
|
} else {
|
|
// Database 강제 모드 또는 기본 Database 설정
|
|
if ($forceDatabase && $this->driver === RedisHandler::class) {
|
|
log_message('info', 'Session: Forced to use DatabaseHandler (SESSION_FORCE_DATABASE=true)');
|
|
$this->driver = DatabaseHandler::class;
|
|
}
|
|
$this->savePath = 'ci_sessions';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Session Match IP
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* Whether to match the user's IP address when reading the session data.
|
|
*
|
|
* WARNING: If you're using the database driver, don't forget to update
|
|
* your session table's PRIMARY KEY when changing this setting.
|
|
*/
|
|
public bool $matchIP = false;
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Session Time to Update
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* How many seconds between CI regenerating the session ID.
|
|
*/
|
|
public int $timeToUpdate = 300;
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Session Regenerate Destroy
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* Whether to destroy session data associated with the old session ID
|
|
* when auto-regenerating the session ID. When set to FALSE, the data
|
|
* will be later deleted by the garbage collector.
|
|
*/
|
|
public bool $regenerateDestroy = false;
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Session Database Group
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* DB Group for the database session.
|
|
*/
|
|
public ?string $DBGroup = null;
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Lock Retry Interval (microseconds)
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* This is used for RedisHandler.
|
|
*
|
|
* Time (microseconds) to wait if lock cannot be acquired.
|
|
* The default is 100,000 microseconds (= 0.1 seconds).
|
|
*/
|
|
public int $lockRetryInterval = 100_000;
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Lock Max Retries
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* This is used for RedisHandler.
|
|
*
|
|
* Maximum number of lock acquisition attempts.
|
|
* The default is 300 times. That is lock timeout is about 30 (0.1 * 300)
|
|
* seconds.
|
|
*/
|
|
public int $lockMaxRetries = 300;
|
|
}
|