如果数据长度可能超过BLOB大小,如何存储CodeIgniter会话数据?

时间:2019-02-26 18:59:18

标签: php mysql codeigniter session

我有一个精心设计的多页查询表单。实际上,我的站点中有几个用于查询不同数据集的。由于这些查询参数跨越多个页面请求,因此我依靠会话来存储累积的查询参数。我担心会话中存储的数据在进行序列化时可能会超过CodeIgniter session documentation指定的data列的MySQL BLOB存储容量(65,535字节):

CREATE TABLE IF NOT EXISTS `ci_sessions` (
        `id` varchar(128) NOT NULL,
        `ip_address` varchar(45) NOT NULL,
        `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
        `data` blob NOT NULL,
        KEY `ci_sessions_timestamp` (`timestamp`)
);

如何存储用户输入的查询参数,并确保为给定用户保留这些参数?

我考虑过使用file-based-caching通过会话ID生成的密钥来缓存此数据:

// controller method
public function my_page() {
  // blah blah check POST for incoming query params and validate them
  $validated_query_params = $this->input->post(); 

  // session library is auto-loaded
  // but apparently new session id generated every five mins by default?
  $cache_key = "query_params_for_sess_id" . $this->session->session_id;

  $this->load->driver('cache');
  // cache for an hour
  $this->cache->file->save($cache_key, $validated_query_params, 3600);
}

但是,我担心为给定用户生成新的会话ID时,会话ID可能会更改。显然this happens by default every five minutes是CodeIgniter生成的新会话ID,以增强安全性。

任何人都可以建议使用一种久经考验的方法(有效!)来存储超过64K blob大小的会话数据?

1 个答案:

答案 0 :(得分:0)

您可以使用MEDIUMBLOB(最多支持16MB)或LONGBLOB(最多支持4GB)。

请参见https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html

此外,如果您声明的Blob的长度类似于BLOB(2000000)(无论您需要的长度是多少),它将自动将其提升为可以容纳该长度数据的数据类型。例如,BLOB(2000000)将隐式变为MEDIUMBLOB

mysql> create table t ( b blob(2000000) );

mysql> show create table t\G
*************************** 1. row ***************************
       Table: tt
Create Table: CREATE TABLE `tt` (
  `b` mediumblob
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4