我有一个精心设计的多页查询表单。实际上,我的站点中有几个用于查询不同数据集的。由于这些查询参数跨越多个页面请求,因此我依靠会话来存储累积的查询参数。我担心会话中存储的数据在进行序列化时可能会超过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大小的会话数据?
答案 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