稍后执行脚本

时间:2011-07-27 22:56:43

标签: php

对于我正在制作的个人游戏,我希望在一段时间内使用php功能。

例如,现在它被设置为如果用户希望在游戏中购买士兵,他填写表格并在提交时,用户的数据库条目立即更新以反映士兵的变化。

我想要的是在表格提交和士兵实际出现之间(模拟训练时间等)之间有时间延迟。

我想到了一种可能的方法,但我希望它不是最好的方法。我可以创建一个新的数据库表,“actions”包含动作类型(即要执行的任务,在这种情况下是训练士兵),参数(士兵数量)以及动作的开始/结束时间。每当用户加载页面时,页面都会检查是否已完成任何操作并执行它们。

此问题的关键问题是操作仅在用户加载页面时执行。他可以购买士兵并让他们在他登录时不会出现,这可能使他在很长一段时间内都处于弱势。

我可以通过在任何人加载页面时检查所有用户的操作来解决这个问题,但我相信这会对服务器产生不必要的负担,除了相当难以实现之外。

有没有人有更好的想法,或者我的思路是最好的方法?谢谢!

3 个答案:

答案 0 :(得分:2)

你发明了一个工作队列,这是一个很好的一步。您的解决方案的问题是每个客户端(对于每个请求)不断检查要执行的操作,这是很多不必要的工作。

使用一个调度程序脚本以每分钟/小时/ ..轮询该数据库,执行挂起的任务并删除已完成的条目会好得多。设置一个cron作业,甚至在intervalls中调用该脚本。

答案 1 :(得分:1)

的cronjob

最简单的是使用cronjob。如果您无法安装cron(作业),则可以使用在线cronjob网络服务,例如http://www.setcronjob.com/http://www.onlinecronjobs.com/http://cronless.com/

http://www.setcronjob.com/只有10美元的无限计划(我觉得很便宜)。

消息队列

最有效的方法是使用具有delayed puts的高级邮件队列,例如beanstalkd。有许多教程可用于解释消息队列,beanstalkd。

答案 2 :(得分:0)

我会建议一个cron工作。这是您设置为按时间间隔执行的脚本。在你的情况下,我建议可能每十五分钟执行一次。

然后我们假设您需要半小时才能训练士兵。您只需检查该脚本,自购买士兵以来是否已经整整半小时。因为脚本每十五分钟只检查一次,所以它可能需要30分钟到45分钟才能更新,但是你可以通过某种方式播放它以使它看起来像是故意的。

例如,用户在下午3:54购买士兵,并且您的脚本设置为每15分钟运行一次(4:00,4:15,4:4,4:45 ......等)。由于士兵们将在4:30开放,你可以告诉他们下一个训练营在6分钟内开始训练,所以他们知道士兵准备好总共需要36分钟。

您甚至可以将训练时间作为游戏的可升级方面,因此用户可以购买更好的训练营或需要15分钟而不是半小时的训练营。你明白了这个想法:)