脚本运行时是否可以动态重新加载PHP代码?

脚本运行时是否可以动态重新加载PHP代码?,php,reload,multiplayer,Php,Reload,Multiplayer,我有一个使用PHPSockets的多人服务器,因此完全是用PHP编写的 目前,每当我对PHP服务器脚本进行任何更改时,我都必须终止该脚本,然后重新启动它。这意味着任何在线用户都被断开连接(通常不是问题,因为现在没有那么多) 现在我正在重写服务器脚本,以使用定制的PHP类,并稍微整理一下(您不想知道它今天看起来有多糟糕)。今天我在想:“难道不可能在不重新启动整个脚本的情况下对php源代码进行更改吗?” 例如,我计划创建一个main.php文件,其中包括user.php,其中包含类MyUser和ga

我有一个使用PHPSockets的多人服务器,因此完全是用PHP编写的

目前,每当我对PHP服务器脚本进行任何更改时,我都必须终止该脚本,然后重新启动它。这意味着任何在线用户都被断开连接(通常不是问题,因为现在没有那么多)

现在我正在重写服务器脚本,以使用定制的PHP类,并稍微整理一下(您不想知道它今天看起来有多糟糕)。今天我在想:“难道不可能在不重新启动整个脚本的情况下对php源代码进行更改吗?”

例如,我计划创建一个
main.php
文件,其中包括
user.php
,其中包含类
MyUser
game.php
,其中包含类
MyGame
现在让我们假设我想更改
user.php
并“重新加载”服务器,以便
user.php
的更改生效,而不会断开任何在线用户的连接?

我试图找到其他问题来回答这个问题,我得到的最接近的问题是这个问题:,然而,这似乎并不能解决在线用户断开连接的问题

更新

我自己的解决办法是:

  • 在特殊情况下,包括external.php文件,它可以访问一些变量,并根据需要使用它们。在执行此操作时,我必须确保代码中没有错误,因为如果我尝试访问不存在的方法,整个服务器将崩溃
  • 将整个过程重写为Java,这给了我使用动态类重新加载添加插件系统的可能性。工作起来很有魅力。再见
  • 不需要重新启动整个脚本就可以对php源代码进行更改吗

    [……]

    我计划创建一个包含user.php的main.php文件 其中包含MyUser类


    在你的情况下,你不能。在运行的脚本中只能定义一次类。您需要重新启动脚本以重新定义这些类。

    我对PHP不太熟悉,但我会假设创建了一个进程来运行脚本,在这样做时,它复制运行程序所需的指令并开始在CPU上执行,在此期间,如果您要“更新”指令,您需要终止进程并重新启动它。include是一种将类和文件链接在一起的奇特方式,但最终处理器会将这些信息与存储它们的文件的位置分开,并且在重新启动进程之前,这些信息最终是不同的


    我不知道有哪一个系统可以在其中创建代码并主动编辑它,并在代码运行时查看更改。大多数活动程序需要重新启动才能重新加载新的源代码。

    我对PC上的游戏不太了解,但您可以尝试从数据库中为用户获取所有变量,然后使用这些变量更新文本字段或按钮

    web中使用的是AJAX(在不刷新页面的情况下更改数据)。这不是用于编程的吗?

    将允许您在运行时添加、删除和重新定义方法(以及其他内容)。虽然不能更改类或其现有实例的已定义属性,但它允许您更改这些对象的行为


    我不建议将此作为永久解决方案,但它在开发过程中可能会很有用。最终,您将希望将游戏状态存储到文件、数据库等中。

    您不能再次包含具有相同
    类的
    文件,但可以使用
    数组
    。如果确实需要,还可以将
    数组
    转换为
    。这只适用于数据,而不适用于行为(方法)。

    当主脚本从缓存加载并经常检查新操作码时,如何将用户对象存储到缓存中

    要在缓存中包含函数,必须包含。例如:

    if (!apc_exists('area')) {
      // simple closure
      // calculates area given length and width
      $area = new SuperClosure(
        function($length, $width) {
          return $length * $width;
        }
      );
      apc_store('area', $area);
      echo 'Added closure to cache.';
    } else {
      $func = apc_fetch('area');
      echo 'Retrieved closure from cache. ';
      echo 'The area of a 6x5 polygon is: ' . $func(6,5);
    }
    

    .

    简单解决方案使用$MyUser而不是MyUser

    require MyUserV1.php;
    $MyUser = 'MyUserV1';
    $oldUser = new $MyUser('your name');
    //Some time after
    require MyUserV2.php;
    $MyUser = 'MyUserV2';
    $newUser = new $MyUser('your name');
    
    每个声明的类都保留在内存中,但在最后一次MyUserV1注销时变得未使用
    您可以使它们从抽象类MyUser继承,以便使用is_a

    我通常会以与语言无关的格式(如XML文件)存储可修改的“配置”信息,并对其进行修改。然后应该是一个简单的方法调用来重新加载配置文件,并且用Java或Python编写的资产(例如)也可以从外部轻松地操作服务器。至于动态更改程序的源代码?首先,这似乎是一个坏主意……我认为你真正应该关注的是,你是否真的需要每个玩家一个插座,或者你是否可以让游戏更具状态。因此,客户端可以发送正常的web请求,而不是从客户端到服务器的开放连接。但我明白这可能意味着完全重写,在这一点上不是一个选项?此外,php不支持“取消定义”类,因此,如果您已经定义了类“测试”,则无法重新包含文件来定义类“测试”。我认为,对于我所知道的所有在线游戏,当管理员想要对游戏文件应用更新时,服务器会重新加载,用户会断开连接。也许最好有一个所有用户都能连接到的在线版本和一个只有你(或少数人)能连接到的测试版本。如果希望更改生效,请将其保存到联机版本并重新启动服务器。这意味着你不必为你想做的每一个小改动重新启动在线版本。这是不可能的。然而,你可以通过修改你的设计来完全避免它