2012-01-08 7 views
2

私はMercurialを使用して、他のリポジトリに基づいてリポジトリを作成しています(つまり、それらをマージする)。これは、サーバー上でPHPを使用しているすてきなウェブインターフェイスによって実現されます。複数のプロセス間でmercurialコマンドサーバを共有

残念ながら、これは非常に遅いです(PHPは現在、要求ごとに約40回のexec()を必要としています)。だから私は、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つのサーバーのソケット/パイプ/何かを使用し始めるとどうなりますか?

答えて

1

コマンド・サーバーはブロックであり、一度に1つの要求のみを処理します。現在のところ、(Mercurial 2.0のように)あなたが提案したようにソケット上でサーバに接続する方法はありませんが、その機能を持つことは確かに興味深いでしょう。

異なるリクエストをスピードアップするために使用することはできませんが、1回のリクエストで40回のMercurialが開始された場合、40回のリクエストが同じコマンドサーバーを通過することから、

複数の(並行して)クライアントからコマンドサーバーに話を聞きたい場合は、Mercurial mailing listでディスカッションを開始することをお勧めします。

+0

いつものように短くてポイントに。ありがとうございます:-) – xrstf

+0

これは素晴らしい質問です。私は同じことを不思議に思う他の人のためにここでそれを文書化することができてうれしいです。 –