【问题标题】:How to store CodeIgniter session data if data length likely to exceed BLOB size?如果数据长度可能超过 BLOB 大小,如何存储 CodeIgniter 会话数据?
【发布时间】:2019-07-20 09:36:38
【问题描述】:

我有一个相当精细的多页查询表单。实际上,我的网站有几个用于查询不同的数据集。由于这些查询参数跨越多个页面请求,我依靠会话来存储累积的查询参数。我担心存储在 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 大小的会话数据的方法吗?

【问题讨论】:

    标签: php mysql codeigniter session


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 有两点让我对这种方法有所保留:1) 我的数据库服务器是一台单独的机器,而且非常繁忙。这意味着大型数据将通过网络传输每个页面请求的数据库连接。 2) MEDIUMBLOB 是否存在速度问题?我从other posts 了解到,磁盘存储似乎很高效,没有太多开销,但是有什么速度差异或其他我应该担心的问题吗?
    • 我也感谢您使用BLOB(2000000) 的提示——这是否会对存储的数据量施加上限?还是 MySQL 会创建一个截断为 16MB 的 MEDIUMBLOB 列?
    • 它只是创建了一个 mediumblob,即存储至少 2M 字节所需的最小数据类型。 mediumblob 仍然允许其常规最大长度,最大为 16MB。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多