修改正在运行的脚本并重新加载而不会将其删除(php)

时间:2011-05-20 06:42:44

标签: php bash shell gnu-screen

我有一个在Debian上运行的游戏服务器,玩家可以通过网络编辑(已经运行的)PHP脚本来修改游戏。但是,一旦对脚本进行了更改并保存,只有在脚本被终止并重新启动后才会发生更改的影响(我必须在终端中手动执行此操作)。如果没有给用户提供shell访问权限,那么一旦做出更改,脚本如何知道重新加载自己的新版本?该脚本在GNU Screen中运行。

虽然我对GNU屏幕,php和linux命令的总体了解有限,但我认为必须有一种方法可以完成。

最简单的方法是什么?

修改 为了澄清,人们修改的脚本是一个基本脚本,通常读取服务器输出日志。因此,当脚本看到“PLAYER_DIED”时,它会写入一个文件,而该文件又由服务器读取并执行某些操作,例如生成区域。 人们现在使用链接到php源代码的基本的基于Web的文本编辑器编辑此脚本

2 个答案:

答案 0 :(得分:2)

有很多方法可以实现这一点,但由于您不共享任何源代码,因此很难说哪种方法最好。

为什么不在用于让玩家修改脚本的相同脚本中重新启动它?

另一种解决方案是使用一个小的cron脚本,每分钟运行一次,以检查文件是否已更改。如果是这样,它将重新启动实例。在最糟糕的情况下,玩家必须等待一分钟才能看到变化。

另外,我想知道你是否正在使用运行由玩家编辑的实际脚本的某种守护程序,或者如果你直接运行该脚本。

答案 1 :(得分:1)

在黑暗中拍摄..但似乎您需要使用PHP的过程控制功能来终止脚本并在您知道脚本已更改后再次运行它。我没有对此进行过测试(根本没有),所以请加上一粒盐:

// signal handler function
function sig_handler($signo)
{

     switch ($signo) {            
         case SIGHUP:
             // Asked to restart. I guess you will need to call `exec` to start a new instance before terminating

             break;
         default:
             // handle all other signals
     }

}

// setup signal handler
pcntl_signal(SIGHUP,  "sig_handler");

// Send restart signal to self (after you detect the script was modified):
posix_kill(posix_getpid(), SIGHUP);

使用pcntl_* functions有一些限制:PHP需要作为CGI运行,您需要使用--enable-pcntl编译php。既然你说你拥有硬件,我想这应该不是问题。