我会尝试以最好的方式解释我的问题。 我不是要求代码,只是为了获得最好的方法。
我想创建一个浏览器游戏,并利用时间升级内容,构建等等。
例如,建造1栋房屋需要1小时。
所以我会在用户采取行动的那一刻保存timestamp+(60*60)
。
我的问题是,如何以最佳方式更新它?
我想到的一种方法是添加功能,检查用户的每个页面视图是否已完成。 但是如果他没有登录,那么更新就不会发生。
我想到的第二种方法是为任何用户的每个页面视图检查每个注册的用户。但它没有效果,如果没有用户登录就会出现问题。
有什么建议吗?
答案 0 :(得分:1)
我的游戏很简单,没有crons。 当玩家想要需要时间的东西时,我只是在结束该工作的适当时间更新了他的数据库信息(列只是示例)
UPDATE player SET jobend = UNIX_TIMESTAMP() + (60*60*4) # ending in 4 hours
然后,每个页面都有关于剩余时间的信息,我只是使用了这样的东西:
SELECT (jobend - UNIX_TIMESTAMP()) AS jobremaining FROM player
我使用strftime正确格式化了时间,并将其显示给用户。 在剩余时间为负的情况下,工作完成了。 不需要绝对计数,因为用户在连接时能够对工作做些什么。
当玩家刚改变页面或做其他事情时,我有一个功能,我只是检查所有及时事件,而用户在线(所以要抓住任何负面计时器),然后提出javascript任何更改(我发布javascript计数器为每一页)
现在,如果你谈到实时更新, cron 就是这样,但你确定你需要它来进行游戏吗?我自己也问过这个问题而答案却不是。
修改强>
如果其他玩家看到buildings on schedule
页面(假设页面),我正在进行相同的计算;如果某个时间对某个特定玩家来说是负面的(无论其他玩家是否看到该页面),我只会奖励他在建筑物中(在数据库中我做出所有更改),即使他离线。这没有什么害处,因为他无论如何都做不了什么。其他玩家只会看到他有一座建筑物。这里的关键是我执行所需的更新PHP代码,无论玩家与游戏的连接;只要至少有一名玩家登录,我就会执行所有进度功能。
这听起来并不慢(通过仅使用访问特定页面的连接播放器来更新所有玩家)。你只需要一张“工作”表,并根据当前时间检查计时器。更像是一个获得消极的查询。