Я использую Mercurial для создания репозиториев на основе других репозиториев (т. Е. Их объединения). Это делается с помощью небольшого веб-интерфейса с использованием PHP на сервере.
К сожалению, для некоторых задач это очень медленно (неудивительно, что PHP в настоящее время должен выполнять exec () hg примерно 40 раз за запрос). Поэтому я подумал об использовании командного сервера, доступного в Mercurial 1.9 +.
Что касается документации, я могу запустить простой hg serve
и позволить ему работать с несколькими репозиториями (давая каждой команде опцию -R
). Это замечательно. Но могу ли я также разделить командный сервер между несколькими (и, возможно, одновременными) запросами?
Я делаю что-то вроде этого, чтобы запустить сервер из моего скрипта PHP:
$cmd = 'hg serve --cmdserver pipe';
$pipes = null;
$descriptors = array(
STDIN => array('pipe', 'r'),
STDOUT => array('pipe', 'w')
);
$process = proc_open($cmd, $descriptors, $pipes);
if (!is_resource($process)) {
throw new Exception('Could not start command server.');
}
Но это делает сервер доступным только для текущего процесса PHP. Так как я не знаком с использованием каналов и прочего, я теперь задаюсь вопросом: возможно ли запустить сервер один раз (вне PHP) и «подключиться» к нему? Как открытие сокета и чтение / запись в него.
И если это возможно: это мудро? Что происходит, когда несколько процессов PHP начинают использовать сокет / канал одного сервера / что угодно?