3

这是我的问题,对于那些看了标题并认为“PHP 不等待用户输入,因为它是一种服务器端语言,因此你的问题是客户端语言”的人,请听我说完。

我在做游戏。这是多人游戏,因此有多个用户。在每一轮游戏开始时,参与游戏的用户会被提示选择他们想要在该轮做的事情。当然,在每个人都选择了他们想要在该轮中做什么之前,该轮不会开始。

看,那是我的问题。如何让脚本在继续执行之前等待“所有”用户发送请求(发送输入)?服务器端语言是 PHP。答案不会在客户端,因为客户端只对一个用户负责,并且不知道其他用户在做什么。

谢谢。

4

2 回答 2

3

从根本上说,您有两个选择:

选择一,你让每个脚本检查它是否有它需要的所有数据,然后做所有的工作来计算下一步(或其他)。这实际上比听起来要困难得多,因为您会遇到并发问题。

基本上,这种方法会导致不止一个“过程”——页面加载——试图对相同的数据做同样的工作,这为你要么根本不做工作,要么做的比赛打开了大门它两次。

选择二,听起来更难,是你编写另一个 PHP 脚本来检查它是否有所有的动作,计算结果,并在后台更新数据库(或其他)。

然后,通过 cron 作业或类似的方式运行它,这样您一次只能运行一个实例。这让生活变得更轻松:您的“一切都完成了”脚本只运行一次,因此您不必担心比赛 - 但在提交最后一步和计算结果之间可能存在延迟。

从长远来看,这种方法实际上更容易,因为虽然它涉及更多代码和更多移动部件,但它实际上避免了困难问题(并发),以换取一些更简单的问题(更多代码,使用 cron)。

当然,您可以在这两个方面进行改进,但这些是基本模型。锁定和其他协调技术可以使“在最后一页计算”工作得更好,但它们涉及到你解决比赛。

使用各种“后台作业”工具可以改善第二种方法的延迟,让您立即触发检查,而不仅仅是在计时器上。您仍然有一些延迟,但用户看不到它。

但是,实际上,您可以选择这两种策略中的一种并采用它。

(另外,我强烈建议如果可以的话,抓住一个框架或其他人已经解决了这些问题的东西,然后使用它。)

于 2012-09-11T23:04:21.903 回答
0

由于您无法将数据推出,我将按以下方式解决此问题:

  1. 在例如数据库中收集服务器上提交的信息
  2. 运行客户端脚本以定期检查所有必需的信息是否可用
  3. 在客户端评估响应:如果为真,开始游戏 - 如果不是“等待”=继续检查

所以你需要:

  • 收集信息的服务器上的脚本
  • 检查所有信息是否可用的服务器脚本
  • 定期检查和评估的客户端脚本
于 2012-09-11T23:11:37.520 回答