そもそも今時、CodeIgniter3(以下CI3)なんて使っている環境は無いと思われますが、世の中にはナカナカアップグレードできない事情や、する必要性が無いケースもあるわけです。
今回もそんな環境の一つで、以前解決したことがある件なのに、数年経過してまた同じところで躓いたのでメモしておきまソ。
現象としては、ファイル管理していたSessionをRedis化しようと、設定を変更してみたもののなんか30秒近く画面が遷移できず、エラー表示すると冒頭のようなエラーが発生するという現象。
A PHP Error was encountered
Severity: Warning
Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time
Filename: Session/Session_driver.php
Line Number: 188
Backtrace:
File: /var/www/vhosts/●●●/ci/application/core/MY_Controller.php
Line: 47
Function: __construct
File: /var/www/vhosts/●●●/ci/application/controllers/Home.php
Line: 18
Function: __construct
File: /var/www/vhosts/●●●/httpdocs/index.php
Line: 323
Function: require_once
MA PHP Error was encountered
Severity: Warning
essage: session_start(): Failed to read session data: user (path: /var/lib/php/session)
Filename: Session/Session.php
Line Number: 143
Backtrace:
File: /var/www/vhosts/●●●/ci/application/core/MY_Controller.php
Line: 47
Function: __construct
File: /var/www/vhosts/●●●/ci/application/controllers/Home.php
Line: 18
Function: __construct
File: /var/www/vhosts/●●●/httpdocs/index.php
Line: 323
Function: require_once
config/config.php
$config['sess_driver'] = 'files';
$config['sess_save_path'] = APPPATH . 'logs/session';
これをこんな感じに変更。
$config['sess_driver'] = 'redis';
$config['sess_save_path'] = 'tcp://127.0.0.1:6379?database=9';
コンソールで「redis-cli monitor」でRedisを観察してみる。
1702538830.788839 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
1702538831.791015 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
1702538832.801927 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
1702538833.802712 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
1702538835.157297 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
1702538836.158223 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
1702538837.160083 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
1702538838.161192 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
1702538839.162114 [9 127.0.0.1:40836] "TTL" "ci_session:pq11ulmkpim44pfk2hvtaicavu:lock"
:
:
こんな感じで、30秒ほどロックされていて進まない。
問題はセッションのRedis用ドライバー。
下記で、解決。めでたしめでたし。
system/libraries/Session/drivers/Session_redis_driver.php
public function write($session_id, $session_data)
の
$this->_redis->EXPIRE($this->_lock_key, 300);
↓
$this->_redis->EXPIRE($this->_lock_key, 1);
protected function _get_lock($session_id)
の
return $this->_redis->EXPIRE($this->_lock_key, 300);
↓
return $this->_redis->EXPIRE($this->_lock_key, 1);
if ( ! $this->_redis->setex($lock_key, 300, time()))
↓
if ( ! $this->_redis->setex($lock_key, 1, time()))
public function close()
の
if ($this->_redis->close() === FALSE)
↓
if ($this->_redis->close() === $this->_failure)
Add comment