Модификация работающего скрипта и его перезагрузка без уничтожения (php) - PullRequest
1 голос
/ 20 мая 2011

У меня есть игровой сервер, работающий в Debian, где игроки могут редактировать (уже запущенный) скрипт php через Интернет, чтобы модифицировать игру. Однако после внесения изменений в сценарий и его сохранения изменения вступают в силу только после того, как сценарий будет убит и перезагружен (я должен сделать это вручную в терминале). Не предоставляя пользователям доступ к оболочке, как сценарий может узнать, что он перезагрузил новую версию после внесения изменений? Сценарий выполняется на экране GNU.

Хотя мои общие знания о командах GNU screen, php и linux ограничены, я думаю, что для этого должен быть способ.

Каким будет самый простой способ?

EDIT Чтобы уточнить, сценарий, который изменяют люди, является базовым сценарием, который обычно читает журнал вывода сервера. Поэтому, когда скрипт видит «PLAYER_DIED», он записывает в файл, который, в свою очередь, читается сервером и выполняет некоторые действия, например, порождает зону. Люди редактируют этот скрипт прямо сейчас с помощью основного текстового редактора, связанного с исходным кодом php

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

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

Почему бы не перезапустить его в том же сценарии, который вы используетепозволить игрокам модифицировать скрипт?

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

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

1 голос
/ 20 мая 2011

Съемка в темноте здесь ... но, похоже, вам нужно будет использовать функции управления процессом 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 и вам нужно скомпилировать php с --enable-pcntl.Поскольку вы сказали, что у вас есть оборудование, я думаю, это не должно быть проблемой.

...