Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.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作业或循环谁';It’他经常检查表上的字段_Php_Mysql_Jobs - Fatal编程技术网

Php 创建MySql作业或循环谁';It’他经常检查表上的字段

Php 创建MySql作业或循环谁';It’他经常检查表上的字段,php,mysql,jobs,Php,Mysql,Jobs,我目前正在开发一款浏览器多人游戏,在这个概念上有一些问题。这是一个我喜欢的地方(http://www.ogame.org/)使用PHP/Js/MySql 我想要的是,玩家将启动一个动作(砍柴),这个动作将在XX分钟后结束 因此,基本上我的想法是创建一个动态cron,它将在XX分钟后启动一个SQL查询,将DB XX resources添加到播放器中 另一个问题是,玩家可以用他们的船在海上航行,因此,如果他们要移动到某个目的地,例如,他们将每5分钟移动XX米 所以问题是所有的玩家都能在海上看到彼此。

我目前正在开发一款浏览器多人游戏,在这个概念上有一些问题。这是一个我喜欢的地方(http://www.ogame.org/)使用PHP/Js/MySql

我想要的是,玩家将启动一个动作(砍柴),这个动作将在XX分钟后结束

因此,基本上我的想法是创建一个动态cron,它将在XX分钟后启动一个SQL查询,将DB XX resources添加到播放器中

另一个问题是,玩家可以用他们的船在海上航行,因此,如果他们要移动到某个目的地,例如,他们将每5分钟移动XX米

所以问题是所有的玩家都能在海上看到彼此。所以基本上,我不能等待10分钟来增加XX米的球员船,它必须在5分钟后完成

编辑:所以基本上我需要一个像MySql一样的工作,或者一个不断检查表的无限循环。此表将包含所有操作的结束时间(时间戳)。因此,当这个时间与当前时间相对应时,作业必须执行Sql查询

希望你们理解我的问题;)

您想要的是一个“作业系统”,或“排队系统”,或“事件系统”,或“消息队列”

这些可能非常复杂,但简单的版本可能如下所示:

  • 您有一个数据库表,它只存储一个“消息”队列,每行一条消息,每个消息都有一些字段指定应该处理它的时间。要么立即,要么在一段时间之后,等等
  • 您的应用程序将根据需要插入此表
  • 您有一个单独的守护进程正在运行,其任务是智能地处理此队列。例如,它根据插入事件行时指定的条件,下拉任何准备好处理的事件。然后它处理它们。您可以在Neverening while()循环中运行此脚本,然后将脚本本身作为后台进程在服务器上运行。如果你能很好地处理内存管理,脚本可以永远运行
  • 此设置存在大量问题,例如:

    • 如果需要在多个服务器之间分配任务,会发生什么情况
    • 当守护进程处理事件的速度比插入新事件的速度慢时,会发生什么情况
    避免这些方法的更好的解决方案是向第三方管理的消息队列服务(如AmazonSQS)投入一些资金,或者使用支持这种服务的预构建框架(如gearman)。这样,您就可以一次巧妙地从多台机器中提取一个事件,而这些机器实际上不必关心系统的积压程度-它们只需愉快地处理事件。

    您想要的是一个“作业系统”,或“排队系统”,或“事件系统”,或“消息队列”

    这些可能非常复杂,但简单的版本可能如下所示:

  • 您有一个数据库表,它只存储一个“消息”队列,每行一条消息,每个消息都有一些字段指定应该处理它的时间。要么立即,要么在一段时间之后,等等
  • 您的应用程序将根据需要插入此表
  • 您有一个单独的守护进程正在运行,其任务是智能地处理此队列。例如,它根据插入事件行时指定的条件,下拉任何准备好处理的事件。然后它处理它们。您可以在Neverening while()循环中运行此脚本,然后将脚本本身作为后台进程在服务器上运行。如果你能很好地处理内存管理,脚本可以永远运行
  • 此设置存在大量问题,例如:

    • 如果需要在多个服务器之间分配任务,会发生什么情况
    • 当守护进程处理事件的速度比插入新事件的速度慢时,会发生什么情况

    避免这些方法的更好的解决方案是向第三方管理的消息队列服务(如AmazonSQS)投入一些资金,或者使用支持这种服务的预构建框架(如gearman)。这样,您就可以从多台机器上一次智能地提取一个事件,而这些机器实际上不必关心系统的积压程度——它们只需要愉快地处理事件。

    您可以在数据库中设置一个事件表,而不是在将来运行特定的脚本。因此,当用户启动砍柴任务时(比如上午10:30),您将添加一个事件,以在上午10:35增加他们的木材平衡5


    然后您就有了一个每分钟都在运行的cron脚本。它获取当前时间,并在数据库表中查找时间小于或等于当前时间的任何事件。然后执行该操作并从表中删除事件记录。或者,如果您需要为您的玩家保留这些事件的历史记录,您可以创建一个名为processed的列来跟踪事件是否已执行。在这种情况下,cron脚本会在当前时间之前查找未处理的事件。

    您可以在数据库中设置一个事件表,而不是在将来运行特定的脚本。因此,当用户启动砍柴任务时(比如上午10:30),您将添加一个事件,以在上午10:35增加他们的木材平衡5


    然后您就有了一个每分钟都在运行的cron脚本。它获取当前时间,并在数据库表中查找时间小于或等于当前时间的任何事件。然后执行该操作并从表中删除事件记录。或者,如果您需要为您的玩家保留这些事件的历史记录,您可以创建一个名为processed的列来跟踪事件是否已执行。在这种情况下,cron脚本会在当前时间之前查找未处理的事件。

    为什么不在数据库中设置一个时间,在该时间之后“将添加资源”(即更改变为活动状态)?只要有一个带有超时列的队列表,当您检查资源级别时