2012-03-27 67 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

相關問題