У меня есть скрипт демона PHP, запущенный в командной строке, который может быть подключен через telnet и т. Д. И должен быть подан командами.Перезагрузка класса
Что он делает с этой командой, зависит от того, какие модули загружены, что в настоящее время выполняется с самого начала. (Psuedocode ниже для краткости)
$modules = LoadModules();
StartConnection();
while(true){
ListenForCommands();
}
function LoadModules(){
$modules = Array();
$dir = scandir("modules");
foreach($dir as $folder){
include("modules/".$folder."/".$folder.".php");
$modules[$folder] = new $folder;
}
}
function ListenForCommands(){
if(($command = GetData())!==false){
if(isset($modules[$command])){
$modules[$command]->run();
}
}
}
Итак, пример модуль, который называется "bustimes" был бы класс под названием bustimes, живущих в /modules/bustimes/bustimes.php
Это прекрасно работает. Тем не менее, я хотел бы сделать так, чтобы модули могли обновляться «на лету», поэтому, как часть ListenForCommands, он смотрит на файловое время модуля, работает, если он изменен, и, если это так, эффективно перезагружает класс.
Здесь возникает проблема, очевидно, если я снова включу файл класса, это будет ошибкой, поскольку класс уже существует.
Все идеи, которые я имею о том, как обойти эту проблему до сих пор, довольно больны, и я бы хотел избежать этого.
У меня есть несколько потенциальных решений до сих пор, но я не доволен ни одним из них.
когда модуль обновления, сделать это в новом пространстве имен и указать ссылку там
мне не нравится этот вариант, и я не уверен, что это можно сделать (как будто я прав , пространства имен должны быть определены в верхней части файла? Это определенно связано с файлом file_get_contents(), но я бы предпочел избежать этого)
Анализ файла PHP, а затем с помощью метода runkit-метода-переопределить все методов.
Все, что связано с этим анализом, является плохим планом.
Вместо того, чтобы включать файл, сделайте копию файла со всем тем же, но str_replacing имя класса, чтобы что-то с rand() на конце или аналогично, чтобы сделать его уникальным.
Есть ли у кого-нибудь лучшие идеи о том, как: а) обойти эту проблему или б) реструктурировать модульную систему, чтобы эта проблема не возникала?
Любые советы/идеи/конструктивная критика были бы очень желанными!
Редактировать: Исправлена ручная ссылка на английскую версию. – Kethryweryn
Я пойду сегодня вечером и посмотрю, как хорошо это работает, спасибо =] – Doug
Не стесняйтесь обращаться за дополнительной помощью, если вы столкнулись с проблемой, сначала вилка может быть немного сложной. – Kethryweryn