这是做我想要的好方法(在PHP中)吗?

时间:2009-05-20 06:32:17

标签: php arrays

我一直在为我的网站创建一个简单的论坛。我添加了一个功能,可以标记自您上次访问后未读帖子+论坛。

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

  

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

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

如果你那么这是另一个问题,毕竟$_SESSION是一个全局变量(ewwww)。

答案 1 :(得分:0)

你可以去另一条路线......

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

为每个帖子/论坛添加last_updated时间戳字段。

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

答案 2 :(得分:0)

我的实践说:不要担心哈希表的性能,但要考虑与数据库相关的问题,因为它们是资源中最昂贵的(特别是在充满文本的类似论坛的项目中)。我从未遇到过与PHP性能相关的问题。 MySQL问题总是变得更快。