是否有可能重新加载动态PHP代码的脚本运行时?(Is it possible to dynamica

2019-09-17 19:33发布

我在这是一个使用PHPSockets多人服务器,从而在PHP编写的。

目前,每当我正在做的PHP服务器脚本的任何改变我要杀死该脚本,然后再次启动它了。 这意味着任何用户在线断开(通常都不是问题,因为没有目前这么多)。

现在我重写服务器脚本中使用自定义的PHP类和sorten的东西一点点(你不想知道今天怎么讨厌看)。 今天,我在想:“难道不应该有可能进行更改PHP源,而无需重新启动整个脚本?”。

例如,我打算在具有main.php是包括文件user.php含有类MyUsergame.php其中包含类MyGame现在,让我们说,我想做出改变,以user.php和“重载”的服务器,以便将更改user.php生效,而无需断开任何在线用户?

我试图发现回答了这个问题了,我得到了最接近的是这样一个问题: 修改正在运行的脚本,并让它重新加载,而不杀死它(PHP) ,然而这似乎并没有解决在线用户的断线。

UPDATE

我自己的这个解决方案是:

  1. 在特殊occations,包括文件external.php,它可以访问一些变量并使用它们然而,它想。 做这件事时,我必须确保有在代码中没有错误,如果我试图访问一个不存在的方法在整个服务器会崩溃。
  2. 重写整个事情去渣 ,这给了我使用动态类重载添加一个插件系统的可能性。 奇迹般有效。 再见PHP。

Answer 1:

难道不应该有可能进行更改PHP源,而无需重新启动整个脚本?

[...]

我打算在具有被包括user.php的含有类MYUSER一个main.php文件

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



Answer 2:

我不是太熟悉PHP,但我会假设,创建一个进程来运行脚本,这样做它复制所需的指令来运行程序,并在此开始在CPU上执行,如果你是“更新”说明,你需要杀掉该进程最终并重新启动它。 包括是你的类和文件链接在一起,但最终该处理器将信息从他们的文件存储在何处分离的奇特的方式,直到你重新启动该进程最终是不同的。

我不知道在哪个而代码正在运行,你可以创建代码,并积极对其进行编辑和查看更改任何系统。 最活跃的程序需要重新启动以重新加载新的源代码。



Answer 3:

Runkit将让你在运行时添加,删除和重新定义的方法(除其他事项外)。 虽然你不能改变一个类定义的属性或现有的情况下,将允许您更改这些对象的行为。

我不建议这是一个永久的解决方案,但在开发过程中它可能是有用的。 最终,你会希望游戏状态存储到文件,数据库, 内存缓存 ,等等。



Answer 4:

你可以不include同样具有相同的文件class ,但你可以用这样做array 。 您也可以从转换arrayclass ,如果你真的需要这么做。 这仅适用于数据,虽然不是行为(方法)。



Answer 5:

如何存储你的用户对象为APC缓存而从缓存中,并检查每隔一段时间新的操作码主脚本负荷。

要在高速缓存中的功能,你必须包括SuperClosure类 。 一个例子是:

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);
}

在这里看到的APC的教程 。



Answer 6:

简单的解决方案,可以用$ 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



Answer 7:

我不知道很多关于这些东西在PC上的游戏,但你可以使用这些变量尝试从数据库中获取用户的所有变量,然后更新文本字段或按钮

在网络使用(而无需刷新页面变化数据).Isn't一个编程AJAX?



文章来源: Is it possible to dynamically reload PHP code while script is running?