Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何处理和监视存储在MySQL数据库中的基于时间的事件?_Php_Mysql - Fatal编程技术网

Php 如何处理和监视存储在MySQL数据库中的基于时间的事件?

Php 如何处理和监视存储在MySQL数据库中的基于时间的事件?,php,mysql,Php,Mysql,我正在创建一个基于浏览器的MMO,它包含基于时间的事件:即,一座建筑物的建造需要23个小时 我可以将其记录在MySQL数据库中,然后使用cron脚本或watch()在事件表(或等效表)中循环 似乎大家普遍认为我可以: (1) 为处理事件及其相关触发器的脚本每秒运行一次cron作业 (2) 每分钟运行一次cron作业,每秒循环59次,以处理事件及其相关触发器 (3) 使用watch每秒运行一次php脚本 本质上,在事件完成后,脚本将处理一些触发器,这些触发器的范围包括更改状态、更新数据库、触发最近

我正在创建一个基于浏览器的MMO,它包含基于时间的事件:即,一座建筑物的建造需要23个小时

我可以将其记录在MySQL数据库中,然后使用cron脚本或
watch
()在事件表(或等效表)中循环

似乎大家普遍认为我可以:

(1) 为处理事件及其相关触发器的脚本每秒运行一次cron作业

(2) 每分钟运行一次cron作业,每秒循环59次,以处理事件及其相关触发器

(3) 使用
watch
每秒运行一次php脚本

本质上,在事件完成后,脚本将处理一些触发器,这些触发器的范围包括更改状态、更新数据库、触发最近事件之后排队的其他“事件”,等等

我最担心的是每秒处理10000多个事件和触发器的可能性。我可以使用哪些策略来避免性能问题?这些都是解决方案,还是有更好的替代方案

示例事件:

Construction of Building A - 00:43:21
快进2601秒,执行以下触发器:

Place Building A on map at Location x,y
Update resource total given by building
Start timer on next building in the queue
Construction of Building B - 02:10:49
为了更好地解释:在游戏的早期阶段,这些活动将花费5分钟到1小时的时间。在比赛的后期阶段,这些项目将相隔数百小时。我需要实时处理这些事件,因为它们会影响游戏的其他方面(例如资源结构,提高每小时提供的资源量)。因此,无论用户是否处于活动状态,服务器都需要处理这些事件。理论脚本将检查过期事件,然后根据该事件运行与所述事件过期相关的其他几种方法。

听起来一个事件库可能会给你很大的帮助

您可以在prggmr中编写一个简单的时间间隔,以拾取将来需要发生的事件,并将它们注册到事件引擎中,以便在该时间发出信号,而不是尝试使用一个监控将来发生的所有事件的“全覆盖”

像下面这样的方法可能会奏效

prggmr\interval(function(){
    $query = mysql_query("SELECT event, when FROM events");
    while($event = mysql_fetch_assoc($query)) {
        prggmr\setTimeout(function() use ($event){
            prggmr\signal($event['event']);
        }, $event['when']);
    }
    // What this would do is look for any events that require signaling in the
    // in the future such as a building construction and signal it when the 
    // given amount of time in milliseconds has run
}, 3600);
// This simply tells the engine to run the function every minute
要运行此代码,请将其存储在event_detect.php中

prggmr event_detect.php
您通常希望由另一个应用程序(如runit)管理该进程

通过这种方法,您可以将所有可能发生在应用程序中的事件作为注册的“信号处理程序”进行构建,并在后台运行一个实际的游戏引擎,该引擎可以在事件发生时实时等待和监视事件,而无需任何用户交互

我们正在开发一款类似的游戏,我们正在使用这种方法。。。逻辑上完全不同,但非用户交互事件处理是相同的


此外,为了提高性能,您可以非常轻松地在一秒钟或更短的时间内处理10000个事件,具体取决于您的服务器。

游戏和CRON作业之间的关系。.10000多个事件和触发器。.您能举个例子吗…为什么要使用CRON作业?我只需要在PHP中创建一个函数,每当与建筑物进行任何交互时,它都会“在事件表中循环”,这将在这场战争中节省大量的处理能力。我自己玩过很多RTS游戏,大概有60-70%的用户不活跃。在没有交互的情况下更新他们的东西是没有意义的。我认为技术的选择是一个重要因素。PHP和MySQL并不真正适合您试图完成的任务。我将考虑创建一个nodejs进程来跟踪事件并使用超时来处理操作。这样,您将拥有一个轻量级流程,可以跟踪数千个活动事件,并且仅在需要时生成新流程。