【问题标题】:How to take an action after certain time (different from user to user)?如何在一定时间后采取行动(因用户而异)?
【发布时间】:2012-06-09 22:42:09
【问题描述】:

我正在开发一个网页游戏(js php mysql),其中一个人点击一个按钮来开始一个需要时间来完成的动作(比如说 10 小时),当它完成时,一些分数会被添加到该玩家的总分中..问题是即使玩家在动作完成时不在线,我也需要添加这些分数。例如,我需要更新排名,或者向玩家发送电子邮件。

我想过让 cron 作业不断检查结束动作,但我认为这会消耗资源(不断检查数千名玩家的动作..)。

这个问题有更好的解决方案吗?

感谢您的关注!!

【问题讨论】:

  • 听起来 cron 作业正是您所需要的。
  • 我不想通过大量不必要的轮询使服务器超载。但是,考虑到所有因素,服务器端“cron”工作可能是您最好的选择。恕我直言...

标签: php javascript mysql cron


【解决方案1】:

您可以在数据库完成后写入数据库,当用户登录时,您可以将赚取的积分添加到他的帐户中。您也可以使用 cronjob 进行检查。即使你有数百万用户这个也不会杀死你的服务器。

【讨论】:

  • 如何不使服务器超载?考虑到数以百万计的用户每个人都有不止一项操作...
  • @pogush 这对每个数据库来说都是一项简单的工作,您可以使用存储过程和良好的索引进行很多优化。
  • 依赖服务器286?超级计算机,没有细节无法回答。
  • 我运行了一个每秒最多 3.000 次查询的统计服务器和一个 cron 作业,它每 60 秒汇总一次数据 => 在双核 2.4 Ghz 上运行约 120.000 条记录,没有任何问题。跨度>
  • @Oliver 感谢您提供的信息!我想我会走那条路,时间会说这是否符合我的需求(和我的服务器!)
【解决方案2】:

Cron 非常适合这个。你可以在存储过程中编写你的任务,然后让 cron 运行一个 SQL 脚本来调用存储过程来更新你的玩家的记录。

数据库的设计目的是有效地处理成千上万条信息,所以我不认为它会杀死系统资源的想法是有效的,除非你的托管系统已经受到限制。

【讨论】:

    【解决方案3】:

    如果您想防止作弊,您无论如何都需要在服务器上进行检查。如果“等待”发生在客户端的 Javascript 中,则可以轻松减少剩余时间。

    因此,您需要将作业发送到服务器(假定可以安全地防止时钟修改),服务器将确定结束时间戳。您可以将作业存储在队列中。

    如果您只需要用户本人的此信息,则可以在用户登录时查看队列。否则每分钟(或左右)运行一次 cron 作业。此作业将标记所有作业在其时间戳过去时已完成(并将它们从数据库中删除)。

    如果您需要更精确的检查,您将需要提出一个更频繁地执行此操作的替代服务器端解决方案(例如,每隔几秒轮询一次数据库的简单程序)。

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 2020-04-05
      • 2012-08-21
      • 2021-07-23
      • 1970-01-01
      相关资源
      最近更新 更多