【问题标题】:Is this a good way of doing what I want (in PHP)?这是做我想做的事(在PHP中)的好方法吗?
【发布时间】:2009-05-20 06:32:16
【问题描述】:

我一直在为我的网站创建一个简单的论坛。我正在添加一项功能,该功能将标记自您上次访问以来的未读帖子和论坛。

我实质上是用每个用户帐户存储上次访问论坛的日期。当用户返回站点时,将运行查询以获取所有 post_id 和 post_parent_forum 值,然后将其添加到数组中,该数组存储在 SESSION 变量中,键为 post_id(唯一)和值作为论坛 ID(这不会是唯一的,因为帖子会出现在少数论坛中)。

在论坛索引中,我对每个论坛使用in_array(),查看forum_id是否在数组中,如果在则标记为“未读”。

在线程列表中,我使用 array_key_exists() 来查看每个线程 ID 的键是否在数组中,如果是,则标记为“未读”。

当查看帖子时,该项目将从数组中删除,其键等于线程的 ID。

这种方法是否合理,或者如果论坛变得更受欢迎,我会遇到问题吗?我担心在每个论坛列表上运行 20 个 array_key_exists() 检查。它相当快吗?

附带说明....我可以直接使用 SESSION 存储数组,还是必须将其值分配给常规变量,删除一个键,取消设置旧会话 var,然后重新设置它更新后的数组?

【问题讨论】:

  • 如果用户登录、注销然后重新登录,这会起作用吗?那不是所有帖子都标记为“已读”吗?
  • 否,因为他们上次访问的时间戳仍会保存在他们的帐户中。所以只有自上次访问后添加的项目(在此示例中为 1 分钟或更短时间)。
  • 我假设,“自您上次访问以来”是指自您上次成功登录(当前登录之前的一次)以来,而不是最后一次页面刷新。
  • 最后一次刷新,因为我想在访问期间创建的数组中添加新线程。

标签: php arrays


【解决方案1】:

php 数组是哈希表!哈希键查找不是很昂贵,所以不,我认为您不会因此遇到性能问题。

in_array 是另一回事(搜索整个数组),但实际上 - 它仍然不应该是一个问题。提防过早的优化!

我可以直接使用 SESSION 存储数组吗

是的。 $_SESSION (通常)只是一个数组,当您通过反序列化会话文件内容调用 session_start() 时填充该数组。当脚本结束或调用session_write_close() 时,$_SESSION 数组将serialize() 回到文件中。真的没有魔法。

如果您应该这样做是另一个问题,毕竟$_SESSION 是一个全局变量 (ewwww)。

【讨论】:

  • 我认为这样做更快(也更懒惰)......而不是阅读、修改、取消设置和重置。
  • 这没什么错,如果事情没有变得太复杂的话。但我见过可以让勇敢的人发疯的怪物。如果我想保持清洁,我通常会编写一个充当看门人的类。
【解决方案2】:

只是你可以去的另一条路线......

在用户表中有一个 last_activity 时间戳字段,并在每次用户加载新页面时更新它。

每个帖子/论坛都有一个 last_updated 时间戳字段。

要查看论坛/帖子是否“未读”,您只需比较时间戳即可。

【讨论】:

  • 无论我查看帖子,活动时间戳都会更新。
  • 我不确定你在说什么。每次页面加载都会更新用户活动 ts。帖子/论坛 ts 会更新每个评论/线程/任何内容。这样您就知道上次加载页面的时间以及上次更新对象的时间。您应该能够使用该信息获取未读对象吗?
  • 如果帖子时间戳也会在视图上更新,它会将帖子注册为您已阅读,即使其他人阅读它们也是如此。否则,每篇文章都会在用户加载第一页后被“阅读”。
  • 您仍然必须以某种方式标记读取的对象。如果用户活动时间戳大于线程的最后更新时间戳,即使从未打开,它也会显示为“已读”。
  • 啊,是的,我现在明白你的意思了。对不起。
【解决方案3】:

我的做法是:不要担心哈希表的性能,而要考虑与 db 相关的问题,因为它们是最昂贵的资源(尤其是在充满文本的类似论坛的项目中)。我从未遇到过与 PHP 性能相关的问题。 MySQL 问题总是来得更快。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多