PHP: CodeIgniter3でSessionにRedisを使うと遅くなる件をFix

そもそも今時、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

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください