你想实现一个多用户游戏,所以你应该为它使用客户端-服务器架构:设置一个在你的机器上运行并跟踪游戏状态的单一的、持久的服务器进程。每个用户请求都由一个 PHP“客户端”脚本处理,该脚本与游戏服务器对话并询问所有必要的信息。
这样,所有Room
对象和所有玩家状态都存在于一个进程中:服务器。网络服务器(不要与您的游戏服务器混淆)启动客户端线程,它们以您想要的任何方式与游戏服务器异步对话。
如果您的情况非常简单,您也许可以将服务器进程替换为存储游戏当前状态快照的集中式数据库(包括活动房间和相关玩家的完整列表)。每个用户请求从数据库加载游戏状态,并写出任何更改。但我认为长期运行的服务器是更简单的方法。
编辑:您的问题表明对 PHP 的工作方式有些困惑。服务器为处理用户请求而启动的 PHP 线程非常短暂。假设您有 5 名玩家已经玩了一个小时。每隔几分钟或几秒钟,玩家就会向您的网络服务器发送一个请求。服务器启动一个处理请求并退出的 PHP 线程。游戏可能会持续几个小时,但大多数时候没有正在运行的线程,也没有类的实例可以计算。在任何时候,你都会有一些没有活跃连接的玩家。所以你需要某种持久的实体来在请求之间保持他们的游戏状态,你不妨让它独一无二。
编辑2:由于您似乎有点过头了,也许您应该选择第二个选项:忘记进程间通信并将游戏状态保存在数据库中:
每个 php 请求都是一个玩家操作。当用户单击一个按钮或其他任何东西时,您的 php 脚本会从数据库中加载它为游戏当前状态建模所需的所有信息。它会进行任何必要的清理工作(停用所有很久以前停止玩游戏的用户),然后处理用户的操作,保存对数据库的任何更改,并为用户生成一个新页面。然后它退出。这一切只需要一小部分时间。然后下一个用户(或同一个用户)提交另一个动作,你重新开始。
并发呢?除非您设法获得大量用户并且您的脚本真的很慢,否则不会有任何用户:您一次只能运行一个脚本副本。如果要禁止并发执行,请使用数据库事务来确保一次处理一个用户操作。如果这还不够,请了解客户端-服务器架构、进程间通信以及客户端-服务器解决方案所需的所有其他内容。