服务器上有多少个类的实例?

时间:2013-03-01 20:16:45

标签: php

是否可以知道一个PHP类的实例对象在整个服务器上 (对于所有用户,而不仅仅是一个线程)。

这就是我想要这样做的原因。我正在制作一个纸牌游戏,我希望有Room类(具有独特的房间名称,当前在线的玩家在房间内,socked id ...)所以当一些用户加入服务器以获得活动房间的新列表时。当一个房间被取消(销毁)时,我会向所有用户发送该信息(基本上是实时的房间状态)。


好的,这就是我想要这样做的原因。 我正在制作纸牌游戏项目,我希望有Room类(具有独特的房间名称,目前在线的玩家在房间内,socked id ...)所以当一些用户加入服务器以获得活动房间的新列表时。当一个房间被取消(销毁)时,我会向所有用户发送该信息(基本上是实时的房间状态)。我希望你明白我想做什么。

3 个答案:

答案 0 :(得分:4)

您希望实施多用户游戏,因此您应该使用客户端 - 服务器架构:设置运行的单个持久服务器进程你的机器并跟踪游戏状态。每个用户请求都由PHP"客户端"与游戏服务器通信并询问所有必要信息的脚本。

这样,所有Room个对象和所有玩家状态都存在于一个进程中:服务器。网络服务器(不要与你的游戏服务器混淆)启动客户端线程,它们以任何你想要的方式与游戏服务器异步通话。

如果您的情况非常简单,您可以使用集中式数据库替换服务器进程,该数据库存储游戏当前状态的快照(包括活动房间和相关玩家的完整列表)。每个用户请求从数据库加载游戏状态,并写出任何更改。但我认为长时间运行的服务器是更容易的方法。

编辑:您的问题表明对PHP如何运作存在一些疑惑。服务器为处理用户请求而启动的PHP线程非常短暂。让我们假设你有5名玩家已经参加了一个小时。每隔几分钟或几秒钟,玩家就会向您的网络服务器发送一个请求。服务器启动一个PHP线程来处理请求并退出。游戏可能持续数小时,但大部分时间都有没有正在运行的线程和没有类的实例。在任何时候,你有一些没有活跃联系的玩家。因此,您需要一些类型的持久实体来在请求之间保持其游戏状态,您也可以将其设置为唯一。

编辑2:因为看起来你有点过头了,也许你应该选择第二个选项:忘记进程间通信并将游戏状态保持在 数据库:

每个php请求都是一个玩家动作。当用户点击按钮或其他任何内容时,您的php脚本会从数据库中加载模拟游戏当前状态所需的所有信息。它执行任何必要的清洁工作(停用很久以前停止播放的任何用户),然后处理用户的操作,保存对数据库的任何更改,并为用户生成新页面。然后它退出。这一切都需要一小部分时间。然后,下一个用户(或同一个用户)提交另一个操作,然后重新开始。

并发性怎么样?除非你设法让很多用户你的脚本真的很慢,否则就不会有:你永远不会一次运行一个脚本副本。如果要禁止并发执行,请使用数据库事务确保一次处理一个用户操作。如果仍然不够,请了解客户端 - 服务器体系结构,进程间通信以及客户端 - 服务器解决方案所需的所有其他内容。

答案 1 :(得分:2)

这绝对是一种粗略的方法,但你只需在类的构造函数中添加一些东西。这可能是记录某些东西,发送电子邮件,阅读计数器和增加等等......

显然,如果你想知道在任何给定时间点有多少个实例,你也需要在析构函数中使用一些东西...

在阅读完答案后(应该是对原始问题的评论),实现此问题的最佳方法是使用类方法和属性,这样任何实例都可以读取/更改共享计数。您仍然可以使用构造函数和析构函数来递增/递减活动表的数量等...但是该类将保留一个计数,可供所有实例访问。

答案 2 :(得分:0)

简短的回答是否定的。很长很复杂的答案是肯定的,但它需要大量的黑客攻击,要么编辑php源代码,要么使用gdb(或类似的东西)来检查正在运行的内存。据我所知,绝对没有开箱即用的支持。

更好的问题是为什么你需要这个?你最有可能试图解决一个更容易解决的问题。

你可以通过在对象实例化和破坏时使用APC递增和递减来逃避但是如果真的有这么多对象需要对它们进行计数,那么你肯定会导致很大的性能问题。