是否有可能知道整个服务器上一个PHP类有多少个实例对象(对于所有用户,而不仅仅是一个线程)。
这就是我想要这样做的原因。我正在制作一个纸牌游戏,我想要房间类(具有唯一的房间名称,房间内在线的玩家,锁定的 id ...)所以当一些用户加入服务器以获得新的事件房间列表时。当一个房间被取消(销毁)时,我会向所有用户发送该信息(基本上是实时房间状态)。
好的,这就是我想要这样做的原因。 我正在制作纸牌游戏项目,我想要 Room 类(具有唯一的房间名称,玩家目前在房间内在线,socked id ...)所以当一些用户加入服务器以获得新的事件房间列表时。当一个房间被取消(销毁)时,我会向所有用户发送该信息(基本上是实时房间状态)。我希望你明白我想做什么。
最佳答案
你想实现一个多用户游戏,所以你应该使用一个客户端-服务器架构:设置一个单一的、持久的服务器进程运行在您的机器并跟踪游戏状态。每个用户请求都由一个 PHP“客户端”脚本处理,该脚本与游戏服务器对话并询问所有必要的信息。
这样,所有的 Room 对象和所有的玩家状态都存在于一个进程中:服务器。网络服务器(不要与您的游戏服务器混淆)启动客户端线程,它们以您想要的任何方式与游戏服务器异步通信。
如果您的情况真的很简单,您可以用一个集中式数据库替换服务器进程,该数据库存储游戏当前状态的快照(包括事件房间和相关玩家的完整列表)。每个用户请求从数据库加载游戏状态,并写出任何更改。但我认为长期运行的服务器是更简单的方法。
编辑:您的问题表明您对 PHP 的工作原理有些困惑。服务器启动的用于处理用户请求的 PHP 线程是非常短暂的。假设您有 5 名玩家已经玩了一个小时。每隔几分钟或几秒钟,玩家就会向您的网络服务器发送一个请求。服务器启动一个 PHP 线程来处理请求并退出。游戏可能会持续几个小时,但大部分时间没有正在运行的线程,也没有您的类的实例可以计数。在任何时候,你会有一些没有事件连接的玩家。因此,您需要某种持久实体来在请求之间保持它们的游戏状态,您还不如让它独一无二。
编辑 2: 既然你似乎有点不知所措,也许你应该选择第二个选项:忘掉进程间通信,让游戏状态保持在 数据库:
每个 php 请求都是一个玩家操作。当用户点击按钮或其他任何东西时,您的 PHP 脚本会从数据库加载它需要的所有信息,以模拟游戏的当前状态。它会进行任何必要的清理工作(停用很久以前停止玩游戏的任何用户),然后处理用户的操作,将所有更改保存到数据库,并为用户生成一个新页面。然后它退出。这一切只需要几分之一秒。然后下一个用户(或同一用户)提交另一个操作,然后您重新开始。
并发性如何?除非您设法获得大量用户并且您的脚本真的很慢,否则不会有任何用户:您只会运行一个一次复制脚本。如果您想禁止并发执行,请使用数据库事务来确保一次处理一个用户操作。如果这还不够,请了解客户端-服务器架构、进程间通信以及客户端-服务器解决方案所需的所有其他内容。
关于php - 服务器上有多少个类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166140/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它: