Как сохранить большую строку JSON в cookie с помощью PHP - PullRequest
1 голос
/ 27 марта 2012

Как хранить большие строки JSON в cookie?Я должен использовать только cookie, сеанс не вариант в моем случае.Может кто-нибудь опубликовать пример кода, чтобы сжать строку и сохранить в cookie, а также получить это успешно.Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

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

Однако, если вы настаиваете на сохранении данных в файле cookie, вы можете сжать данные, используя gzcompress(), gzdeflate() или gzencode().Все они предлагают сжатие.gzdeflate() будет лучшим выбором для вашей проблемы, поскольку она наиболее экономична.

$compressedJSON = gzdeflate($json, 9);
setcookie('json', $compressedJSON);

И читать ее

$compressedJSON = $_COOKIE['json'];
$json = gzinflate($compressedJSON);

Имейте в виду, что даже еслисжатие будет достаточным для того, чтобы ваши данные оставались в пределах 4 КБ, вы можете в конечном итоге превысить это, если объем JSON-данных, которые вам нужны, увеличится.

Я все же предлагаю вместо этого использовать базу данных.

0 голосов
/ 27 марта 2012

Если ваша информация настолько велика, вы можете вместо этого использовать локальное хранилище.Не все браузеры поддерживают локальное хранилище, но все современные поддерживают.Если ваш файл cookie слишком велик, вы рискуете получить ошибку HTTP 431.

Таким образом, у вас нет проблем с размером, и вам не нужно передавать большой файл cookie при каждом запросе, вам просто нужно сохранитьуникальный идентификатор в куки.Затем вы можете извлечь большой объект данных из memcache, mysql или любого другого хранилища на стороне сервера, используя уникальный идентификатор.Сеансов не требуется.

0 голосов
/ 27 марта 2012

Как-то так?

Кодировать

$sJSON = json_encode($sSomeJSONData);
setcookie('json', $sJSON);

Декодировать

$sJSON = json_decode($_COOKIE['json']);

--- РЕДАКТИРОВАТЬ ----

Перейти с КристианомОтвет на вопрос об использовании gzip или базы данных имеет смысл ... НО, если вы не можете использовать базу данных, вы можете создать сеанс вручную.

Технически, весь сеанс представляет собой текстовый файл, хранящийся вневеб-дерево, содержащее данные.Вы можете продублировать этот процесс, используя что-то вроде uniqid() для генерации «имени сеанса».

Создайте текстовый файл в заданном каталоге, используя это «имя сеанса» в качестве имени файла, и сохраните «сеанс».name "в вашем cookie.

Затем просто используйте serialize(), unserialize() и file_put_contents(), file_get_contents() для передачи ваших данных между вашей программой и вашим текстовым файлом, используя данные в cookie для поискатекстовый файл.

Потребуются проверки работоспособности и предотвращение угона, но принцип здравый.

...