【问题标题】:Best performance choice for cookie arrays in PHP and JS?PHP 和 JS 中 cookie 数组的最佳性能选择?
【发布时间】:2016-10-08 17:40:48
【问题描述】:

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

所以我已经在 PHP 和 JS 中实现了它。我只是想知道在 cookie 数组方面什么是最佳选择。

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

性能和内存的最佳选择是什么?您必须记住,这也适用于手机,因此,如果用户将数千集标记为已观看,我不希望这会减慢一切。

下面的代码不是真正的代码,只是为了让你理解选项之间的区别。

选项 1

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

$_COOKIE['watched'] = array(1,2,3,4,...)

使用此选项,在电视节目页面中,我总是需要选择整个数组并检查每个单集 ID 是否都是数组中的值。

选项 2

每个 ID 一个 cookie,例如“watched_[ID]”。我只是检查它是否存在。

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

选项 3

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

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

【问题讨论】:

  • 请注意,还有其他可能的选项;例如跟踪 cookie 和服务器端存储或使用 LocalStorage 和 AJAX。不是说它们更好,而是说它们存在。
  • 自从我发现 JS 可以获取和设置 cookie 的那一刻起,我什至从未考虑过使用 AJAX 来检查 cookie 的想法。当我可以避免这种情况时,我为什么还要打扰服务器?无论如何,我已经写下了我认为最好的 3 个选项。当然,我愿意接受任何其他建议,但请记住,我并没有要求在我的网站中处理 cookie 的最佳选择,我要求的是在 cookie 数组中处理数据的最佳方法。
  • AJAX 仅用于渲染您的页面,它用于基于 LocalStorage 生成动态内容。

标签: javascript php arrays json cookies


【解决方案1】:

您选择的方法将完全取决于您拥有的用户类型,如果在您的情况下数据量通常很大,那么您应该使用选项 3,因为关联数组在涉及大数据量时是一种很好的方法,因为它循环遍历它们并获得结果会有些容易。

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

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

【讨论】:

  • 帮助很大,非常感谢。由于用户可以将每个节目都设置为收藏,每集都设置为观看,我将选择选项 3。
【解决方案2】:

在接受的答案中未解决的问题是浏览器 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

其中一些数字可能已经过时...[source]

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

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

【讨论】:

  • 非常感谢您的回答,我不知道 cookie 有浏览器限制。这非常重要,我可以通过设置限制来为“最爱”电视节目修复它。我不能为观看的剧集设置限制,因为这将是无稽之谈……谢谢,我得想点别的办法。
  • 在我尝试为选项 2 编写一个简单的性能测试之前,我也没有考虑过。它只保存了我 10,000 个 cookie 中的 180 个! :)
  • 哈哈是的,这绝对不是一件好事。你有没有想过绕过这个限制的解决方案?我现在的第一个想法是为用户生成一个随机 ID 并将其保存为 cookie,并将与该 ID 关联的收藏夹存储在数据库中。所以这将是用户的 1 个 cookie,我的数据库中的 1 行数据......你觉得这听起来如何?这样我还可以跟踪哪些节目更受欢迎。
  • 听起来不错,虽然我会使用某种跟踪令牌字符串而不是实际的用户 ID。
  • 你已经得到它了,听起来像。我只是建议使用正确的用户 ID 以外的 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多