25

ギアマンサーバーにクエリを実行して、実行しているワーカーのインスタンスの数を特定できるようにしたい(基本的に、それらのタスクを処理するワーカーがいない場合に利用RunTaskA可能であり、利用可能であることを確認したいので、送信できるようにしたい)RunTaskBアラートアウト。

これを行う方法はありますか?

また、ギアマンサーバーにクエリを実行するPHPの方法を知っている場合は、狂った小道具です。

編集:ネイティブで利用可能なPHPギアマン拡張機能については知っていますが、タスク送信拡張機能を探していません。ギアマンサーバーにクエリを実行して、特定のタスクを処理しているワーカーの数を確認できるものが必要です。

4

9 に答える 9

36
class Waps_Gearman_Server {

    /**
     * @var string
     */
    protected $host = "127.0.0.1";
    /**
     * @var int
     */
    protected $port = 4730;

    /**
     * @param string $host
     * @param int $port
     */
    public function __construct($host=null,$port=null){
        if( !is_null($host) ){
            $this->host = $host;
        }
        if( !is_null($port) ){
            $this->port = $port;
        }
    }

    /**
     * @return array | null
     */
    public function getStatus(){
        $status = null;
        $handle = fsockopen($this->host,$this->port,$errorNumber,$errorString,30);
        if($handle!=null){
            fwrite($handle,"status\n");
            while (!feof($handle)) {
                $line = fgets($handle, 4096);
                if( $line==".\n"){
                    break;
                }
                if( preg_match("~^(.*)[ \t](\d+)[ \t](\d+)[ \t](\d+)~",$line,$matches) ){
                    $function = $matches[1];
                    $status['operations'][$function] = array(
                        'function' => $function,
                        'total' => $matches[2],
                        'running' => $matches[3],
                        'connectedWorkers' => $matches[4],
                    );
                }
            }
            fwrite($handle,"workers\n");
            while (!feof($handle)) {
                $line = fgets($handle, 4096);
                if( $line==".\n"){
                    break;
                }
                // FD IP-ADDRESS CLIENT-ID : FUNCTION
                if( preg_match("~^(\d+)[ \t](.*?)[ \t](.*?) : ?(.*)~",$line,$matches) ){
                    $fd = $matches[1];
                    $status['connections'][$fd] = array(
                        'fd' => $fd,
                        'ip' => $matches[2],
                        'id' => $matches[3],
                        'function' => $matches[4],
                    );
                }
            }
            fclose($handle);
        }

        return $status;
    }

}
于 2010-05-27T18:30:21.790 に答える
25

すばやく確認するために、このbashワンライナーを使用します。

# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730

これにより、ローカルホストで実行されているギアマンインスタンスへの接続が開き、「ステータス」クエリが送信されます。これには、そのインスタンスのジョブの名前と数が含まれます。情報は、レポートとアラートのためにgrep / awk/wcなどで処理できます。

接続されているすべてのワーカーを表示する「ワーカー」クエリでも同じことを行います。

# (echo workers ; sleep 0.1) | netcat 127.0.0.1 4730

スリープとは、応答に十分な時間接続を開いたままにすることです。

管理コマンドの完全なリストと、出力の意味はhttp://gearman.org/index.php?id=protocolにあります。「管理プロトコル」を検索するだけです。

于 2010-06-03T10:59:47.907 に答える
4

d5veの答えを拡張するために、netcatはソケットに座って待機するため、実行する最大秒数で-wパラメーターを追加できます。したがって、ローカルホストにクエリを実行している場合:

# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730 -w 1

...それ以外の場合は、コマンドプロンプトに戻ることはありません。

于 2011-04-29T21:40:23.750 に答える
1

ギアマンにそのような拡張機能がないことを私が知っている限り、ワーカースクリプトの管理と監視はあなたの責任であり、この目的のためにこれらのいずれかを試すことができます-

Supervisordは、アプリケーションをバックグラウンドで実行して監視するためのPythonアプリケーションです。

または、ブライアンムーンのギアマンマネージャーを使用できます

于 2010-05-04T11:11:53.247 に答える
1

これが必要だと思います http://github.com/liorbk/php

于 2010-07-21T09:05:31.153 に答える
0

Gearmanにはphp拡張子があります。もう調べましたか?

PHPリンク

于 2010-05-02T05:59:47.890 に答える
0

今日それを見つけました、それを自分でテストしていませんが、それは有望に見えます。

https://github.com/yugene/Gearman-Monitor

于 2013-07-25T21:48:49.783 に答える
0

Pythonでは、次のことができます。

import gearman

admin_client = gearman.GearmanAdminClient(['127.0.0.1:4730',])
status = admin_client.get_status()
for w in status:
   if w["task"] == "YOUR_TASK_NAME":
      print(w)

:上記のコードを実行する例外を回避するには、pipまたはeasy_installを使用して「gearman」という名前のパッケージをインストールする必要があります。

また、一般的にギアマンの管理を簡素化している次の管理クライアントを確認してください。

于 2014-06-13T20:26:16.247 に答える
0

他のすべてが失敗した場合は、Ubuntugearadminのパッケージにあるツールを呼び出して、新しいプロセスで実行することができます。これがその出力フォーマットへの参照ですgearman-toolsexec()

これは、PHPとGearmanが同じサーバーで実行されていることを前提としています。

于 2017-01-09T09:02:20.397 に答える