【问题标题】:Execute php script every 40 milliseconds?每40毫秒执行一次php脚本?
【发布时间】:2010-12-19 05:02:42
【问题描述】:

有什么方法可以每 40 毫秒执行一次 php 脚本? 我不知道 cronjob 是否正确,因为每秒 25 次需要大量 CPU。

好吧,如果 php 不是正确的语言,我应该使用什么语言?

我正在制作一款在线游戏,但我需要一些东西来处理游戏中发生的事情、移动角色、计算射弹路径等。

【问题讨论】:

  • 我已经添加了一些关于我想要做什么的信息。
  • 我认为 PHP 不应该处理后端更新 TBH。
  • 第二。无论如何,PHP 可能会太慢。但是,什么样的在线游戏需要每 40 毫秒 更新一次呢?我没有网络游戏的经验,但我认为即使是最大规模的 MMORPG 也不会以这样的频率更新?
  • 40 毫秒 = 25 帧/秒。这将是一款类似于某些 FPS 游戏的动作游戏(例如反恐精英,每 10 毫秒生成一个新帧!)
  • 使用 GPU 渲染新屏幕与通过 http 更新游戏状态相去甚远。您可能需要重新考虑一些事情。

标签: php scripting


【解决方案1】:

PHP 是一种缓慢的解释型语言。它打开一个文件几乎需要这么长的时间。每 40 毫秒执行一次 PHP 脚本会导致一个巨大的队列,并且很快就会崩溃。这绝对听起来像是您不想使用 PHP 完成的任务,而是一个守护进程或其他快速编译的二进制文件。你想做什么?

【讨论】:

    【解决方案2】:

    据我所知,cronjob 只能每分钟执行一次。这是可能的最短时间。我想知道为什么您需要这么短的执行时间?

    【讨论】:

      【解决方案3】:

      每 40 毫秒令人印象深刻。它不太适合cron,它以 1 分钟为界限。

      也许如果您解释了为什么需要这种级别的性能,我们可以提出一些更好的建议。

      您必须了解的另一件事是,在 UNIX 下创建进程需要时间——这可能更适合于长时间运行的任务,它只启动一次并且每 40 毫秒执行一次所需的活动。

      更新:对于具有这种性能的在线游戏,我认为你真的需要考虑在桌面上运行胖客户端。

      我的意思是一种编译成机器语言的语言(不是解释的)并且大部分代码在客户端上运行,仅使用网络传输需要共享的信息。

      我不怀疑解释型语言适用于性能要求不高的游戏,但我认为,从个人经验来看,您无法为此而摆脱它们。

      【讨论】:

        【解决方案4】:

        如果你真的希望它是 PHP,我想你应该让进程通过 shell 运行,作为某种守护进程,而不是一直打开/关闭它。

        我不知道该怎么做,但我想你至少可以从这篇文章中得到一些启发:

        http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/

        【讨论】:

          【解决方案5】:

          如果您尝试每 40 毫秒调用一次 PHP 脚本,这将涉及:

          • 创建进程
          • 加载 PHP
          • 加载并编译脚本
          • 运行编译好的脚本
          • 删除进程和所有内存

          最好将工作放入循环体中,然后在循环结束时使用time_sleep_until 来完成剩下的 40 毫秒。然后你运行你的 PHP 程序一次。

          请记住,这需要是一个独立的 PHP 程序;从网页运行它会导致网络服务器在该页面上超时,然后过早结束您的脚本。

          【讨论】:

          • 40 毫秒可能是这么短的时间,你甚至不需要任何睡眠,更新本身可能需要这么长时间。
          【解决方案6】:

          正如其他人所说,每 40 毫秒启动一个新进程听起来不是一个好主意。知道你想做什么会很有趣。如果由于某种原因一次执行需要超过 40 毫秒,你想做什么?如果你现在小心点,你可能会得到很多同时运行的进程互相踩踏。

          哪种语言很大程度上取决于您尝试执行的操作,但您应该选择一种支持线程的语言,这样您就不必一直派生一个新进程。 Java、Python 可能适合。

          【讨论】:

          • 我添加了一些关于我想要做什么的信息。我对python一无所知,学习一门新的编程语言需要几个星期。
          【解决方案7】:

          如果后端作业必须处理诸如数据库查询之类的事情,我不太确定每 40 MS 是否现实。您可能会更好地制定一种适应系统条件的方法并尝试hard每秒运行 N 次,而不是像发条一样每 40 毫秒运行一次。同样,这取决于您需要在幕后完成的任务的复杂程度。

          PHP 可能不是编写此代码的最佳语言。这有几个原因:

          • 根据 PHP 的版本,垃圾收集可能会被破坏。如果您使用守护进程,您将面临每秒 N 次内存泄漏的风险。

          • 其他原因详见this answer

          尝试使用 C 或 Python 并记录每次迭代需要多长时间。这使您可以“尽最大努力”每秒运行 N 次,或每 40 MS,以较大者为准。这样可以避免您的进程永远运行,因为每次它完成时,重新开始已经很晚了。

          再次,我不确定这些任务应该在“最坏情况”场景系统负载下花费多长时间..所以我的回答可能完全适用,也可能不适用。无论如何,我建议您不要在 PHP 中编写独立的守护进程。

          【讨论】:

          • 我对python一无所知,也从未使用C创建过这么大的东西
          【解决方案8】:

          PHP 不适合这项工作。如果您想在浏览器中进行如此快速的更新,则需要使用 Javascript。 PHP 仅用于后端,这意味着 PHP 所做的一切都必须从您的服务器发送到浏览器,然后再渲染。

          【讨论】:

          • 但是这个处理不能由用户处理,因为它处理的是游戏中必不可少的东西。
          • 我前段时间写了一个这样的游戏(不是很大),但我是用Javascript在用户端完成所有事情,并将命令发送到服务器。每隔一段时间,它会检查服务器以确保两者的游戏状态相同,然后如果它们不同则刷新页面。我不想推荐它,但我听说 Flash 也适合这类事情。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-23
          • 1970-01-01
          • 2019-03-20
          • 2018-03-06
          相关资源
          最近更新 更多