2012-03-27 173 views
1

如何在cookie中存储大型JSON字符串?我只能使用cookie,在我的情况下,会话不是一个选项。任何人都可以发布示例代码来压缩字符串并存储在cookie中,并且还可以成功检索。谢谢。如何使用PHP在cookie中存储大型JSON字符串

+0

你读过http://php.net/manual/en/features.cookies.php了吗? – Jon 2012-03-27 11:30:16

+0

是的,我读过。 – Dev 2012-03-27 11:32:00

+0

看看http://stackoverflow.com/questions/4225030/jquery-save-json-data-object-in-cookie – NAVEED 2012-03-27 11:32:39

回答

3

压缩数据似乎不是一个好主意。相反,我会将它保存在数据库中,并且只将数据库条目的ID存储在cookie中。这也会阻止人们篡改数据,尽管篡改ID仍然是可能的。使用会话会更好,并消除这一点。

但是,如果你坚持要存储在cookie中的数据,你可以使用gzcompress()gzdeflate()gzencode()压缩数据。这些都提供压缩。 gzdeflate()将是您的问题的最佳选择,因为它是最节省空间的。

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

,并读取它

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

请记住,即使压缩将足以为您的数据留在4K范围内,你可能最终超过,应JSON量您需要存储的数据会增加。

我仍然建议您使用数据库来代替。

+0

请注意,要使用gz *函数,必须启用zlib扩展,默认情况下不是(在非Windows计算机上)。 – 2012-03-27 12:04:11

+0

将这些数据存储在数据库中是最好的建议,thnx。 – Dev 2012-03-27 12:27:49

0

是这样的吗?

编码

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

解码

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

---编辑----

围棋与克里斯蒂安的答案使用gzip或数据库是最有意义?但是如果你不能使用数据库,你可以手动建立会话。

从技术上讲,所有会话都是存储在包含数据的Web树之外的文本文件。您可以使用类似uniqid()的东西来复制该进程以生成“会话名称”。

使用该“会话名称”作为文件名在给定的目录中创建一个文本文件,并将“会话名称”存储在您的Cookie中。

然后只需使用serialize()unserialize()file_put_contents()file_get_contents()你的程序和文本文件之间传输数据,使用cookie中的数据查找的文本文件。

这需要一些健康检查和劫持预防,但原则是健全的。

+0

我需要先压缩JSON字符串。 JSON字符串太长。 – Dev 2012-03-27 11:36:40

+0

整个cookie有一个4K限制,包括名称,值,失效日期等。我认为@dev问的是如果数据超出限制,如何将数据存储在cookie中。 – marvin 2012-03-27 11:42:10

+0

@marvin:太棒了!你几乎在那里。我正在寻找解决方案来压缩数据并存储在cookie中。但是如果有人可以发布类似的(例如使用多个cookie),我会很感激。 – Dev 2012-03-27 11:49:04

0

如果您的信息很大,您可能需要考虑使用本地存储。并非所有的浏览器都支持本地存储,但所有的浏览器都可以。如果您的cookie太大,您可能会收到431 http错误。

因此,您没有尺寸问题,并且不必为每个请求都传递一个大的Cookie,您应该只在cookie中存储一个唯一的ID。然后,您可以使用唯一标识从memcache,mysql或任何其他服务器端存储中检索大数据对象。不需要任何会话。

+0

你能告诉我我们可以储存多大的苦力吗......我们可以像500字一样储存饼干吗? – StaticVariable 2012-08-21 03:05:09

+0

Cookie可以达到4K。这是整个cookie(元数据+数据)。如果您在任何地方靠近,并且需要在本地存储项目,则应使用本地存储。所有现代浏览器都支持它。 – 2012-08-27 15:04:47

相关问题