如何让php脚本等待用户输入

时间:2012-09-11 22:58:04

标签: php multithreading concurrency input game-loop

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

我正在制作游戏。它是多人游戏,因此是多个用户。在每个游戏开始时,参与游戏的用户会被选中他们想要进行的那些事情。当然,这一轮不会开始,直到每个人都选择了他们想要做的那一轮。

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

感谢。

2 个答案:

答案 0 :(得分:3)

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

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

基本上,这种方法导致不止一个“过程” - 页面加载 - 尝试对相同的数据执行相同的工作,这为您根本不做任务的比赛打开了大门,或者你去哪做两次。

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

然后,从一个cron作业或类似的东西运行它,所以你一次只运行一个实例。这让生活变得更轻松:你的“完成所有事情”脚本只运行一次,所以你不必担心比赛 - 但是在最后一次提交和计算结果之间可能存在延迟。

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

当然,你可以改进这两者,但那些是基本模型。锁定和其他协调技术可以使“在最后一页中计算”更好地工作,但它们会让你参与比赛。

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

但是,真的,你可以选择其中一种策略,然后继续使用它。

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

答案 1 :(得分:0)

由于你无法推送数据,我将按如下方式处理:

  1. 在例如DB
  2. 中收集服务器上提交的信息
  3. 运行客户端脚本以定期检查所有必需信息是否可用
  4. 客户端上的
  5. 评估响应:如果为true,则启动游戏 - 如果不是“等待”=继续检查
  6. 所以你需要:

    • 收集信息的服务器上的脚本
    • 检查所有信息是否可用的服务器脚本
    • 定期检查并评估
    • 的客户端脚本