2013-09-13 4 views
1

У меня есть скрипт демона 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, он смотрит на файловое время модуля, работает, если он изменен, и, если это так, эффективно перезагружает класс.

Здесь возникает проблема, очевидно, если я снова включу файл класса, это будет ошибкой, поскольку класс уже существует.

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

У меня есть несколько потенциальных решений до сих пор, но я не доволен ни одним из них.

  1. когда модуль обновления, сделать это в новом пространстве имен и указать ссылку там

    мне не нравится этот вариант, и я не уверен, что это можно сделать (как будто я прав , пространства имен должны быть определены в верхней части файла? Это определенно связано с файлом file_get_contents(), но я бы предпочел избежать этого)

  2. Анализ файла PHP, а затем с помощью метода runkit-метода-переопределить все методов.

    Все, что связано с этим анализом, является плохим планом.

  3. Вместо того, чтобы включать файл, сделайте копию файла со всем тем же, но str_replacing имя класса, чтобы что-то с rand() на конце или аналогично, чтобы сделать его уникальным.

Есть ли у кого-нибудь лучшие идеи о том, как: а) обойти эту проблему или б) реструктурировать модульную систему, чтобы эта проблема не возникала?

Любые советы/идеи/конструктивная критика были бы очень желанными!

ответ

1

Возможно, вы должны загружать файлы по требованию в разветвленный процесс.

Вы получаете запрос => разблокируйте основной процесс, включите модуль и запустите его.

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

Вилка в PHP: http://php.net/manual/en/function.pcntl-fork.php

+0

Редактировать: Исправлена ​​ручная ссылка на английскую версию. – Kethryweryn

+0

Я пойду сегодня вечером и посмотрю, как хорошо это работает, спасибо =] – Doug

+0

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

0

Трюки с пространствами имен будет ошибкой, если модуль использует внешние классы (с относительными путями в пространстве имен). Трюк с разбором очень опасен - что, если модуль должен оставаться в состоянии?Что делать, если изменились не только методы, но, например, имя реализованного интерфейса? Как это повлияет на другие объекты, если у них есть ссылка на экземпляр перезагруженного класса?

Я думаю, что @Kethryweryn - это то, что вы можете попробовать.

Смежные вопросы