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