我在这是一个使用PHPSockets多人服务器,从而在PHP编写的。
目前,每当我正在做的PHP服务器脚本的任何改变我要杀死该脚本,然后再次启动它了。 这意味着任何用户在线断开(通常都不是问题,因为没有目前这么多)。
现在我重写服务器脚本中使用自定义的PHP类和sorten的东西一点点(你不想知道今天怎么讨厌看)。 今天,我在想:“难道不应该有可能进行更改PHP源,而无需重新启动整个脚本?”。
例如,我打算在具有main.php
是包括文件user.php
含有类MyUser
和game.php
其中包含类MyGame
。 现在,让我们说,我想做出改变,以user.php
和“重载”的服务器,以便将更改user.php
生效,而无需断开任何在线用户?
我试图发现回答了这个问题了,我得到了最接近的是这样一个问题: 修改正在运行的脚本,并让它重新加载,而不杀死它(PHP) ,然而这似乎并没有解决在线用户的断线。
UPDATE
我自己的这个解决方案是:
- 在特殊occations,包括文件external.php,它可以访问一些变量并使用它们然而,它想。 做这件事时,我必须确保有在代码中没有错误,如果我试图访问一个不存在的方法在整个服务器会崩溃。
- 重写整个事情去渣 ,这给了我使用动态类重载添加一个插件系统的可能性。 奇迹般有效。 再见PHP。
难道不应该有可能进行更改PHP源,而无需重新启动整个脚本?
[...]
我打算在具有被包括user.php的含有类MYUSER一个main.php文件
在你的情况,你不能。 类只能在运行的脚本中定义一次。 您将需要重新启动脚本来重新定义这些类。
我不是太熟悉PHP,但我会假设,创建一个进程来运行脚本,这样做它复制所需的指令来运行程序,并在此开始在CPU上执行,如果你是“更新”说明,你需要杀掉该进程最终并重新启动它。 包括是你的类和文件链接在一起,但最终该处理器将信息从他们的文件存储在何处分离的奇特的方式,直到你重新启动该进程最终是不同的。
我不知道在哪个而代码正在运行,你可以创建代码,并积极对其进行编辑和查看更改任何系统。 最活跃的程序需要重新启动以重新加载新的源代码。
Runkit将让你在运行时添加,删除和重新定义的方法(除其他事项外)。 虽然你不能改变一个类定义的属性或现有的情况下,将允许您更改这些对象的行为。
我不建议这是一个永久的解决方案,但在开发过程中它可能是有用的。 最终,你会希望游戏状态存储到文件,数据库, 内存缓存 ,等等。
你可以不include
同样具有相同的文件class
,但你可以用这样做array
。 您也可以从转换array
到class
,如果你真的需要这么做。 这仅适用于数据,虽然不是行为(方法)。
如何存储你的用户对象为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的教程 。
简单的解决方案,可以用$ 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
我不知道很多关于这些东西在PC上的游戏,但你可以使用这些变量尝试从数据库中获取用户的所有变量,然后更新文本字段或按钮
在网络使用(而无需刷新页面变化数据).Isn't一个编程AJAX?