2012-01-08 94 views
2

我正在使用Mercurial基於其他存儲庫創建存儲庫(即將它們合併在一起)。這是通過在服務器上使用PHP的一個很好的小型web界面完成的。在多個進程之間共享mercurial命令服務器

不幸的是,對於某些任務來說,這是非常慢的(難怪,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進程開始使用一個服務器的套接字/管道/什麼時會發生什麼?

回答

1

命令服務器是阻止並且一次只能提供一個請求。目前(如Mercurial 2.0)沒有辦法通過套接字連接到服務器,就像你建議的那樣,儘管它具有該功能肯定會很有趣。

所以你不能用它來加速不同的請求,但是如果一個請求啓動40次Mercurial,那麼通過使這40個請求通過相同的命令服務器可能已經有很多東西可以獲得。

如果您有興趣從多個(併發)客戶端與命令服務器交談,那麼我建議您在Mercurial mailing list處開始討論。

+0

一如既往的簡短和重點。謝謝:-) – xrstf 2012-01-08 15:22:01

+0

這是一個很好的問題,我很高興我們可以在這裏爲其他想知道同樣事情的人記錄它。 – 2012-01-08 15:32:32