Переопределить переменную или эффективно перезагрузить класс во время выполнения в php - PullRequest
2 голосов
/ 11 августа 2011

Мне нужно иметь возможность "эффективно" переопределить мой класс, чтобы во время выполнения, пока работает мой IRC-бот PHP, я мог перезагружать модули по мере изменения базы кода, что требует получения класса, но PHP не позволяет он должен быть повторно объявлен, и нет способа объявить класс.

Есть ли способ, которым я могу достичь этого? Возможно, какой-то другой метод? Я пробовал "runkit", но это не удалось.

Мой текущий код здесь: http://pastie.org/private/ptj7c0t0teh3nnzn7ehcg

Итак, чтобы уточнить, мне действительно нужно иметь возможность перезагрузить мой класс, установить его и поместить в свойство в моем основном классе бота, как только код изменится в указанном модуле, пока бот работает (во время выполнения).

1 Ответ

0 голосов
/ 16 августа 2011

Беглый взгляд на ваше приложение заставляет меня поверить, что вам лучше всего использовать базовый класс, как предложено в комментарии выше.

Что-то в пределах:

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

Как уже упоминалось в комментариях, это в конечном итоге заполнит память на сервере, поэтому вы должны планировать перезагрузку службы каждый раз, когда вы вносите существенные изменения, но также позволяет загружать новые версии.по требованию, без остановки службы.

Более стабильный подход заключается в использовании преимуществ управления процессами и выделении демонов для каждого соединения из родительского сценария или реализации системы кэширования, которая хранит все данные на диске /базы данных, так что вы можете обнаружить изменение в версии модуля и мгновенно перезагрузить сервер.Но вышеприведенное решение должно работать для вас:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...