PHP:在给定时间后执行操作

PHP:在给定时间后执行操作,php,time,execution,Php,Time,Execution,早上好/下午好/晚上好,互联网。 我目前正在开发一款wap游戏,遇到了一个问题:对其他玩家施加长期影响。让我解释一下 如果用户使用“即时”功能,它只是一个普通的命令链接,不具有可执行性; 如果用户施法,脚本将执行以下操作: setPlayerState('casting'); sleep($cast_time); executeAbility(); 不过,这只是一个简单的部分。现在如果我们使用更先进的技术,比如诅咒一个玩家,我会迷路。我已经考虑过以下可能性: $time=$_SERVER['R

早上好/下午好/晚上好,互联网。 我目前正在开发一款wap游戏,遇到了一个问题:对其他玩家施加长期影响。让我解释一下

如果用户使用“即时”功能,它只是一个普通的命令链接,不具有可执行性; 如果用户施法,脚本将执行以下操作:

setPlayerState('casting');
sleep($cast_time);
executeAbility();
不过,这只是一个简单的部分。现在如果我们使用更先进的技术,比如诅咒一个玩家,我会迷路。我已经考虑过以下可能性:

$time=$_SERVER['REQUEST_TIME'];
$time_when_the_curse_finishes=$time+$curseDuration;
updateEnemyCurses($curseID,$endTime);
if ($time<$endTime) removeCurse();
这可能看起来很漂亮,但它没有考虑两件事:如果用户在2小时内注销并重新登录,他将在整个2小时内被诅咒,而这种方法不能支持在y秒内每x秒生效一次的诅咒。例如:

诅咒一个。你每2秒受到1点伤害,持续10秒

总而言之,我只需要一两条提示,我如何才能使上面的这句话成为可能。诅咒本身需要全局检查其时间,而不是重新加载页面,并且能够每x秒完成一次查询,直到在10秒内将其删除


我提前感谢这里提供的任何提示

您可能需要考虑为此类维护工作设置cron脚本

它可以在一个固定的时间间隔运行,即每秒为所有玩家处理诅咒等效果

从这里开始:


编辑:正如其他人提到的@mark-b,最好澄清一下:使用一个cronjob来管理所有工作的单个脚本,而不是为每个工作设置多个cronjob。

您可能需要考虑为这种维护工作设置cron脚本

它可以在一个固定的时间间隔运行,即每秒为所有玩家处理诅咒等效果

从这里开始:


编辑:正如其他人提到的@mark-b,最好澄清一下:对管理所有工作的单个脚本使用cronjob,而不是对每个工作使用多个cronjob。

你知道gearman吗?我认为,你必须创造异步工作


看:

你认识gearman吗?我认为,你必须创造异步工作


请看:

我完全理解您的问题,因为在工作中,我必须处理一个需要解决方案的功能,该解决方案可能会对您有所帮助。我所做的是设置一个db表,其中存储了所有必需/挂起的操作以及操作的所有者。这个表有一个时间戳,在一定的时间间隔内,我检查了需要为这个用户执行哪些操作。其他用户也检查了该表,并删除了过去未检索到的操作,即该操作的所有者已注销。这里的问题是,如果根本没有用户登录,该怎么办,而我所做的是,当用户登录时,它首先检查挂起的操作表,并在需要时清理它。我希望我能给你一些见解。祝你好运

我完全理解您的问题,因为在工作中,我必须处理一个需要解决方案的功能,这可能会对您有所帮助。我所做的是设置一个db表,其中存储了所有必需/挂起的操作以及操作的所有者。这个表有一个时间戳,在一定的时间间隔内,我检查了需要为这个用户执行哪些操作。其他用户也检查了该表,并删除了过去未检索到的操作,即该操作的所有者已注销。这里的问题是,如果根本没有用户登录,该怎么办,而我所做的是,当用户登录时,它首先检查挂起的操作表,并在需要时清理它。我希望我能给你一些见解。祝你好运

最好在数据库中实现事件队列。您只需在DB作业队列中添加一个条目,而不是为需要在用户或由用户执行的每个操作创建cron作业

然后,单个cron作业可以将作业从该队列中拉出并处理它们。因此,对于“诅咒”事件,您需要在用户上设置诅咒标志,并计划在现在+5分钟执行一个作业,并说从用户Y中移除诅咒X


cron作业将以游戏中“滴答”的任何速率定期启动,可能会请求在该特定时间段内需要执行的作业列表。

最好在数据库中实现事件队列。您只需在DB作业队列中添加一个条目,而不是为需要在用户或由用户执行的每个操作创建cron作业

然后,单个cron作业可以将作业从该队列中拉出并处理它们。因此,对于“诅咒”事件,您需要在用户上设置诅咒标志,并计划在现在+5分钟执行一个作业,并说从用户Y中移除诅咒X


cron作业将以游戏中“滴答”的任何速率定期启动,可能会请求在特定时间段内需要执行的作业列表。

我想您需要cron作业……我也考虑过cron作业,但不会为其创建文件

每秒约1000-4000人在线的cron作业会杀死服务器?旁白:你在脚本中使用PHP的sleep吗?从用户体验的角度来看,这可能不是一个好主意,除非这是一个ajaxy呼叫。更准确地说,是usleep。我知道这并不完全是一个完美的方法,但它现在已经完成了任务。我想你想要一个cron作业…我也考虑过cron作业,但是为大约1000-4000人在线每秒创建cron作业文件不会杀死服务器吗?旁白:你在脚本中使用PHP的睡眠吗?从用户体验的角度来看,这可能不是一个好主意,除非这是一个ajaxy呼叫。更准确地说,是usleep。我知道这并不是一个完美的方法,但现在它完成了任务。我在页面顶部的评论框中重申了我的问题:我也考虑过cron作业,但是为1000-4000人在线每秒创建cron作业文件不会杀死服务器吗?没有讽刺或不尊重,我只是好奇。这一切都取决于正在执行的脚本。还有你的硬件。。等等:做这样的事情肯定并不少见。如果你的表结构合理,并且有高效的索引,那就不会太糟糕了。这当然很有趣。我肯定会和上面发布的An0n的想法一起尝试,看看哪一个工作得更快。正如Marc的回答所提到的,你不应该为每个操作创建cron作业,你设置了一个通用维护cron作业,可以同时处理所有事情。然而,可能不是一个选项,因为我刚刚发现CRON只能设置为一分钟的精度,并且需要以我能承受的最慢速度每秒执行一次检查。我在页面顶部的评论框中重申了我的问题:我也考虑过CRON作业,但是,每秒为1000-4000人在线创建cron作业文件不会杀死服务器吗?没有讽刺或不尊重,我只是好奇。这一切都取决于正在执行的脚本。还有你的硬件。。等等:做这样的事情肯定并不少见。如果你的表结构合理,并且有高效的索引,那就不会太糟糕了。这当然很有趣。我肯定会和上面发布的An0n的想法一起尝试,看看哪一个工作得更快。正如Marc的回答所提到的,你不应该为每个操作创建cron作业,你设置了一个通用维护cron作业,可以同时处理所有事情。然而,可能不是一个选项,因为我刚刚发现CRON只能设置为一分钟的精度,需要以我能承受的最慢速度每秒执行检查。感谢您的快速回复,但我的项目将首先存储在共享主机上,我将无法访问Gearman,很抱歉。谢谢您的快速回复,但我的项目将首先存储在共享主机上,我恐怕无法访问Gearman。谢谢您的回复。如果我错了,请纠正我:按照您的示例,我将创建一个表,其中包含id、function、time字段,其中id是用户id,function是要执行的php代码,time是时间戳。每当用户在任何地方单击时,脚本都会执行一个查询:$sql=mysql\u fetch\u assocmysql\u querySELECT function,id FROM actions,times实际上我的解决方案涉及一个计时器,它是Adobe Flex下的一个应用程序,每分钟检查一次表,您应该每秒检查一次挂起的操作,并从其他用户删除过去的操作。如果它是一个移动应用程序,您可以使用一些javascript在本地存储当前/挂起的操作,只需检查其他用户的挂起操作。我相信在你的技术下有一种更好的/优化的方法可以做到这一点,但我只有一个共享主机和一个使用flex的php来做到这一点。因为我正在尝试尽可能多的平台,而且大多数旧手机都不支持javascript,所以我仅有的存储空间是$\u会话。说到这里,我不认为这是一个正确的方式,因为它只会搜索你自己的行为,而不是其他人的行为,使“滴答声”变慢。谢谢你的回复。如果我错了,请纠正我:按照您的示例,我将创建一个表,其中包含id、function、time字段,其中id是用户id,function是要执行的php代码,time是时间戳。每当用户在任何地方单击时,脚本都会执行一个查询:$sql=mysql\u fetch\u assocmysql\u querySELECT function,id FROM actions,times实际上我的解决方案涉及一个计时器,它是Adobe Flex下的一个应用程序,每分钟检查一次表,您应该每秒检查一次挂起的操作,并从其他用户删除过去的操作。如果它是一个移动应用程序,您可以使用一些javascript在本地存储当前/挂起的操作,只需检查其他用户的挂起操作。我相信在你的技术下,有一种更好的/优化的方法可以做到这一点,但我只有一个共享主机和php与flex来做到这一点
很多旧手机不支持javascript,我唯一的存储空间是$\u会话。说到这里,我不认为这是一个正确的方式,因为它只会搜索你自己的行为,而不是其他人的行为,使“滴答声”拉格。马克,我相信你刚刚给了我一个完美的答案。不过,我需要一点建议。你认为,我能设置的最短cron周期是什么,它不会烧坏我的主机提供商的计算机?0.3-0.5s是否太低?cron的粒度为1分钟。如果您需要更短的时间间隔,您必须在脚本调度中执行一些操作:Cron启动脚本,然后脚本以您需要的任何亚分钟间隔运行/休眠。Cron是否支持无限循环?例如,当1==1…?在这种情况下,您需要一个守护进程-一个不会退出的后台作业。Cron用于短期重复工作,即启动、做某事,然后退出的工作。如果您需要,守护进程将是一个更好的选择,我怀疑在我的项目开始时使用的共享主机提供商是否支持守护进程,但我相信,一旦它发展起来,守护进程将成为一种方式。如果PHP设置为ipe out,比如说,65-70秒,但是cron作业每秒检查数据库60次,之后,cron重新启动,这是一个简单的函数;睡觉马克,我相信你刚刚给了我一个完美的答案。不过,我需要一点建议。你认为,我能设置的最短cron周期是什么,它不会烧坏我的主机提供商的计算机?0.3-0.5s是否太低?cron的粒度为1分钟。如果您需要更短的时间间隔,您必须在脚本调度中执行一些操作:Cron启动脚本,然后脚本以您需要的任何亚分钟间隔运行/休眠。Cron是否支持无限循环?例如,当1==1…?在这种情况下,您需要一个守护进程-一个不会退出的后台作业。Cron用于短期重复工作,即启动、做某事,然后退出的工作。如果您需要,守护进程将是一个更好的选择,我怀疑在我的项目开始时使用的共享主机提供商是否支持守护进程,但我相信,一旦它发展起来,守护进程将成为一种方式。如果PHP设置为ipe out,比如说,65-70秒,但是cron作业每秒检查数据库60次,之后,cron重新启动,这是一个简单的函数;睡觉你能正确地完成这项工作,是吗?