【发布时间】:2012-06-09 21:44:26
【问题描述】:
我有一个使用 PHPSockets 的多人服务器,因此完全用 PHP 编写。
目前,每当我对 PHP 服务器脚本进行任何更改时,我都必须终止该脚本,然后重新启动它。这意味着任何在线用户都已断开连接(通常不是问题,因为目前没有这么多)。
现在我正在重写服务器脚本以使用自定义 PHP 类并稍微整理一下(你不想知道它今天看起来有多讨厌)。今天我在想:“不应该重新启动整个脚本就可以对php源进行更改吗?”。
例如,我计划创建一个包含user.php 的main.php 文件,其中包含MyUser 类和包含MyGame 类的game.php。 现在假设我想对user.php 进行更改并“重新加载”服务器,以便对user.php 的更改生效,而不会断开任何在线用户?
我试图找到其他回答这个问题的问题,我得到的最接近的是这个问题:Modifying a running script and having it reload without killing it (php),但这似乎并没有解决在线用户断开连接的问题。
更新
我自己的解决方案是:
- 在特殊情况下,包含文件 external.php,它可以访问一些变量并根据需要使用它们。执行此操作时,我必须确保代码中没有错误,因为如果我尝试访问不存在的方法,整个服务器将会崩溃。
- 用 Java 重写整个事情,这让我有可能使用动态类重新加载添加插件系统。奇迹般有效。再见 PHP。
【问题讨论】:
-
我通常会将可修改的“配置”信息以与语言无关的格式(如 XML 文件)存储并对其进行修改。然后它应该是一个简单的方法调用来重新加载配置文件,并且用 Java 或 Python(例如)编写的资产也可以轻松地从外部操作服务器。至于动态更改程序的源代码?首先,这似乎是个坏主意……
-
我认为你真正应该关注的是你是否真的需要每个玩家一个插槽,或者你是否可以让游戏变得更有状态。因此,客户端可以发送正常的 Web 请求,而不是从客户端到服务器的开放连接。但我知道这可能意味着完全重写,此时不是一个选项?此外,php 不支持“取消定义”类,因此如果您已经定义了“Test”类,则无法重新包含文件以再次定义“Test”类。
-
我认为对于我所知道的所有网络游戏来说,当管理员想要对游戏文件应用更新时,服务器会重新加载并且人们会断开连接。也许最好有一个所有用户都可以连接的在线版本和一个只有您(或少数选定的人)可以连接的测试版本。当您希望更改生效时,请将它们保存到在线版本并重新启动服务器。这意味着您不必为要进行的每一个小改动都重新启动在线版本。
-
这是不可能的。但是,您可以通过修改设计来完全避免这种情况。
-
它不是为了改变配置,主要是添加新功能/修复错误(例如新命令,修复用户登录时发生的情况等)@Mike我实际上已经有多个可能的服务器所以绝对可以做到。我喜欢这样。
标签: php reload multiplayer