Как хранить данные сеанса CodeIgniter, если длина данных может превышать размер BLOB? - PullRequest
0 голосов
/ 26 февраля 2019

У меня довольно сложная многостраничная форма запроса.На самом деле, у моего сайта есть несколько запросов к различным наборам данных.Поскольку эти параметры запроса охватывают несколько запросов страниц, я полагаюсь на сеансы для хранения накопленных параметров запроса.Я обеспокоен тем, что данные, хранящиеся в сеансе, после сериализации могут превысить емкость хранилища MySQL BLOB (65 535 байт) столбца data, указанного в документации по сеансу CodeIgniter :

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`)
);

Как я могу сохранить введенные пользователем параметры запроса и быть уверенным, что они будут сохранены для данного пользователя?

Я подумал об использовании файлового кэширования кэшировать эти данные с помощью ключа, сгенерированного из идентификатора сеанса:

// 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);
}

Однако я беспокоюсь, что идентификатор сеанса может измениться, когда для данного пользователя будет создан новый идентификатор сеанса.По-видимому, это происходит по умолчанию каждые пять минут , поскольку CodeIgniter генерирует новые идентификаторы сеанса для повышения безопасности.

Может кто-нибудь предложить проверенное (и эффективное!) Средство хранения данных сеанса, котороепревышает размер капли размером 64 КБ?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете использовать MEDIUMBLOB, который поддерживает до 16 МБ, или LONGBLOB, который поддерживает до 4 ГБ.

См. 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...