Javascript PHP和JS中cookie数组的最佳性能选择?

Javascript PHP和JS中cookie数组的最佳性能选择?,javascript,php,arrays,json,cookies,Javascript,Php,Arrays,Json,Cookies,嗨,我有一个网站,有数百个电视节目和上万集。我希望用户(未登录)能够保存他最喜爱的节目,标记他观看的剧集,并使用cookie保存这些数据 所以我已经在PHP和JS中实现了它。我只是想知道当涉及到饼干阵列时,什么是最好的选择 现在我将数据保存在一个名为“favorites”的cookie中,这是一个JSON编码的数组,其中只包含电视节目的ID。 在cookie“watched”中,有用户标记为watched的剧集ID 性能和内存的最佳选择是什么?你必须记住,这也是为手机设计的,所以,如果用户将上千

嗨,我有一个网站,有数百个电视节目和上万集。我希望用户(未登录)能够保存他最喜爱的节目,标记他观看的剧集,并使用cookie保存这些数据

所以我已经在PHP和JS中实现了它。我只是想知道当涉及到饼干阵列时,什么是最好的选择

现在我将数据保存在一个名为“favorites”的cookie中,这是一个JSON编码的数组,其中只包含电视节目的ID。 在cookie“watched”中,有用户标记为watched的剧集ID

性能和内存的最佳选择是什么?你必须记住,这也是为手机设计的,所以,如果用户将上千集的视频标记为已观看,我不希望这会减慢一切

下面的代码不是真正的代码,只是为了让您了解选项之间的差异

选项1

一个名为“watched”的cookie是一个包含ID的JSON编码数组。我需要检查数组是否包含该值

$_COOKIE['watched'] = array(1,2,3,4,...)
使用此选项,在tv show页面中,我必须始终选择整个数组,并检查每个片段ID是否都是数组中的值

选项2

每个ID对应一个cookie,例如称为“wasted_u[ID]”。我会检查它是否存在

exists( $_COOKIE['watched_1'] ) ? watched : !watched
exists( $_COOKIE['watched_2'] ) ? watched : !watched
选项3

一个名为“watched”的cookie,它是一个关联的JSON编码数组,包含每个电视节目的数组,例如称为“watched[show_ID]”,其中每个cookie只包含标记为属于该节目的已观看片段的ID。(因此,在电视节目页面中,我首先检查“已观看的[节目ID]”,然后我已经拥有了所有已观看的剧集,而不是将每个剧集ID与选项1中的“已观看的”数组进行比较。)

$_COOKIE['watched'] = array(
               1 => array(1,2,3),
               2 => array(4,5,6)
)

您选择的方法将完全取决于您拥有的用户类型,如果您的情况下数据大小通常较大,那么您应该使用选项3,因为对于较大的数据大小,关联数组是一种很好的方法,因为它将在某种程度上很容易通过它们循环并获得结果

如果您的用户数据集相当小,那么选项2是最佳方法,因为我们为每个节目提供不同的cookie,您可以立即检查相应的值

此外,我希望您通过HTML5API使用索引数据库作为问题的解决方案,因为它提供客户端数据库,而且它是一个持久数据库。
希望这有帮助

在公认的答案中没有提到的是浏览器cookie限制(在客户端)。由于允许的cookie数量限制,选项2显然不起作用:

Browser              Num Cookies    Size Per Cookie    Size Per Domain
-------              -----------    ---------------    ---------------
Chrome 8-25          180            4096 bytes         
FireFox 3.6.13-19    150            4097 characters
IE 8/9/10             50            5117 characters    10234 characters
Safari               600            4093 bytes          4093 bytes
Android 2.1/2.3.4     50            4096 bytes
Safari Mobile 5.1    600            4093 bytes          4093 bytes
有些数字可能已经过时了

但是,由于每个cookie/域的大小限制,在使用选项1或3时仍需小心。显示了当一个strigified关联数组包含1000个项,每个项的键长度为7个字符(约12000字节)时,该数组有多大


如果您打算在cookie中存储数千项,您可能需要编写一个cookie包装库,将数据分块到多个cookie中,以避免每个cookie大小的限制。

请注意,还有其他可能的选择,例如跟踪cookie和服务器端存储,或者使用LocalStorage和AJAX。不要说它们更好,但只是说它们存在。自从我发现JS可以获取和设置cookie的那一刻起,我甚至从未考虑过使用AJAX检查cookie的想法。既然我可以避免,为什么还要麻烦服务器呢?无论如何,我已经写下了我认为最好的3个选项。当然,我愿意接受任何其他建议,但请记住因为我没有要求在我的网站中提供处理cookie的最佳选项,所以我要求提供处理cookie数组中数据的最佳方法。然后,AJAX仅用于呈现页面,它用于基于本地存储生成动态内容。这帮了大忙,非常感谢。因为用户可以将每个节目设置为最喜欢的节目每一集我都会选择选项3。非常感谢你的回答,我不知道Cookie的浏览器限制。这非常重要,我可以通过设置限制来修正“最爱”电视节目的限制。我不能为观看的集设置限制tho,因为这将是胡说八道……谢谢你,我必须考虑一下我也没有想到,直到我尝试为选项2编写一个简单的性能测试。它只保存了我10000个cookies中的180个!:)哈哈,是的,这绝对不是一件好事。你有没有想过绕过这个限制的解决方案?我现在的第一个想法是为用户生成一个随机ID并将其保存为cookie,然后将与该ID关联的收藏夹存储在数据库中。因此,它将是用户的一个cookie,我的数据库中的一行数据。。。你觉得怎么样?通过这种方式,我还可以跟踪哪些节目更受欢迎。听起来不错,尽管我会使用某种跟踪令牌字符串,而不是实际的用户id。你已经知道了,听起来像。我只是建议使用一个ID而不是一个合适的用户ID。