重新声明变量,或在运行时在php中有效地重新加载类

时间:2011-08-11 00:24:12

标签: php object

我需要能够“有效地”重新声明我的类,以便在运行时,当我的PHP IRC bot运行时,我可以在代码库更改时重新加载模块,这需要获取类,但PHP不允许它被重新宣布,也没有办法取消一堂课。

有没有办法可以实现这个目标?或许其他一些方法?我试过“runkit”,但那次失败了。

我目前的代码在这里: http://pastie.org/private/ptj7c0t0teh3nnzn7ehcg

因此,为了澄清,我有效地需要能够重新加载我的类,在我的主机器人类中放置一个属性,一旦代码在所述模块中发生更改,同时机器人正在运行(运行时)。 / p>

1 个答案:

答案 0 :(得分:0)

简要介绍一下您的应用程序会让我相信您最好的行动方案是使用上面评论中建议的基类。

达到以下程度:

class IRCModule {

    private static $module_dir = ''; //put your module directory here w/o trailing slash

    public static function getModule( $module ) {

        //if the module directory doesn't exist, don't do anything
        if( !is_dir( self::$module_dir.DIRECTORY_SEPARATOR.$module ) ) return false;

        //load the module file
        $fname = scandir(self::$module_dir.DIRECTORY_SEPARATOR.$module);
        $fname = $fname[2]; //first 2 elements will be . and ..

        require_once( self::$module_dir.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$fname );

        $className = str_replace('.class.php',NULL,$fname);

        return new $className();

    }

}

然后,您将使用您的模块扩展它。这将允许您通过简单地删除它的旧文件/my/module/dir/moduleName/moduleNameV1.0.class.php并用新版本/my/module/dir/moduleName/moduleNameV1.1替换它来覆盖模块。 class.php

正如评论中所提到的,这最终将填满服务器上的内存,因此每次进行实质性更改时都应安排重新启动服务,但它也允许您按需加载新版本而不停止服务

更稳定的方法是利用进程控制并从父脚本中为每个连接分离守护进程,或者实现一个缓存系统,该系统将所有数据存储在磁盘/数据库中,以便您可以检测模块中的更改版本并立即重启服务器。但上述解决方案暂时适用于您:)