使用PHP和MySQL动态推出新站点功能

4
首先,我的问题可能会引发很多意见,并且我相信实现我所寻求的内容有很多方法。
背景:
像Google+和Facebook这样的网站向其用户推出新功能,有时向少数用户推出,有时向公众推出新功能。推出新的网站功能和特点可能是许多网站都在做的事情,包括这里提到的网站。
在我的情况下:
我有一个菜单,每个用户都可以在任何时间访问。这意味着它的作用类似于Windows中的“开始”菜单,非常熟悉。现在,我的菜单可以通过一些PHP代码来请求绘制。目前,我有一个多维数组,其中包含所有菜单项和导航链接。想法是,偶尔当新功能被发布时,我将把它添加到我的多维数组中(稍后将由数据库生成),PHP代码将在菜单中呈现它作为带有(NEW!高亮标记)的新项目。
我的主要问题:
使用数据库表的方法是否是启用/禁用并向您的用户推出新功能的好方法?
我想要实现的例子:
奖励:我想送出50个我的声望点数以获得对我的问题的回答。非常感谢。

坚持使用数据库,长期来看会有回报。 - sitilge
目前我有一个多维数组,其中包含所有菜单项和导航链接。这里我们谈论的嵌套有多深?是否支持完整的导航树? - CD001
1
在这种情况下,正如mike.k的答案所述,您可以将结果集缓存到序列化文本文件中(序列化比json_encode稍快,因此如果您不使用ajax,则值得考虑)。如果您有一个深度嵌套的层次结构,那么值得考虑XML,因为通常会传递树上最低分支的nav id(可能作为GET变量)。DOMDocument / XML允许您轻松获取该特定节点(getElementById)并沿着树向上工作,以确定哪些节点应处于活动状态,而无需使用混乱的递归循环。 - CD001
@CD001 谢谢你的建议,伙计。 - John Smith
3个回答

3

对于近乎静态的菜单,如果期望有一致的结果,你需要避免不断连接数据库和运行 SELECT 查询。

保存菜单内容的数组可以使用 PHP 的 serialize()json_encode() 函数保存到另一个文件中。当进行更改时,用于操作菜单表的代码将调用这些函数来更新静态文件。PHP 组件将从这些文件加载以创建菜单,而不是从数据库加载。

另一种方法是将 json_encode() 内容放入站点 JavaScript 文件之一中,并将其包含在页面中,然后使用 JavaScript 绘制菜单。浏览器会缓存该文件,在更新时,您可以更改文件名或其中的计数器,并同时更改包含行,例如 <script src='./menu_20150718.js'></script>,以便浏览器加载更新的内容。


1
我可以将菜单项存储在Session和Cookie中,避免每次呈现时都连接数据库。 - John Smith
1
我的主要关注点是,数据库方法是否足够好。例如,可以将要呈现的项目存储到数据库中,使用标志列来启用/禁用项目,使用另一列来存储列表顺序,每次添加新功能时,将其作为项目添加到表中,系统会在数组中捕获它并呈现。 - John Smith
1
会话可以用于此,只使用数据库也可以。两者的问题都在于规模。每个会话将数据存储在本地文件中,因此您必须检查是否有足够的空间来支持您预期的人数。每个数据库连接和查询都会消耗一些资源,因此根据预期负载,您应该确定什么是理想的。 - mike.k
1
还要考虑攻击场景,如果有人想用垃圾会话填满您的服务器以填满磁盘空间怎么办? - mike.k
2
听起来你已经有了一个很好的流程。 - mike.k
显示剩余8条评论

1

我认为你说的对,这个问题很可能会引发不同的意见。在我看来,你问题中的关键部分如下所示:

像Google+和Facebook这样的网站向他们的用户推出新功能,有时只针对少数用户,有时则向整个公众推出新功能。

数据库是否有一个包含所有已知用户的User表或类似的表? 如果是这样,那么提供选择将功能滚动到选定的用户上的灵活性是有意义的,可以手动选择,也可以基于诸如角色、地理位置、配置文件等标准。 在这种情况下,最合理的方法是利用数据库的关系特性,例如创建一个Feature表,并通过一个中介(例如UserFeature)与User建立多对多的关系。 这将避免与动态用户数据相关的未来维护问题。

(*) 或选择您自己喜欢的粒度


1
Steve Chambers,我没有使用关系型数据库连接,例如外键等。特别是,由于这可能会在长期运行中变得混乱,我利用PHP本身来跟踪它,通过在某个表格中具有user_id等方式。 - John Smith

0

这不是答案,只是一份信息性回复。@Mike.k和@SteveChambers都提供了有趣的意见,但是他们都没有提供直接的解决方案和证据。无论如何,我将第一个回答标记为“答案”,对于第二个回答,我投了+1。非常感谢。我会让一些管理员在7天结束时决定赏金。:D

此主题已正式关闭。

for(;;) { print(":D"); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接