Любой способ получить доступ к администрации Gearman? - PullRequest
25 голосов
/ 02 мая 2010

Я хочу иметь возможность запросить сервер Gearman, чтобы определить, сколько экземпляров работающего у меня работника (в основном я хочу убедиться, что RunTaskA доступно и RunTaskB доступно, если нет рабочих, обрабатывающих эти задач, я хочу иметь возможность отправить предупреждение.

Есть ли способ сделать это?

Также: Mad поддерживает, если вам известен способ PHP запросить сервер gearman.

Редактировать : Я знаю о PHP-расширении gearman, которое доступно изначально, но я не ищу расширение для отправки задач, мне нужно что-то, что позволяет мне запрашивать сервер gearman и видеть, сколько рабочих служат определенной задаче.

Ответы [ 9 ]

36 голосов
/ 27 мая 2010
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;
    }

}
25 голосов
/ 03 июня 2010

Для быстрой проверки я использую этот однострочный bash:

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

Это открывает соединение с экземпляром gearman, работающим на localhost, и отправляет запрос «status». Он содержит имя и количество заданий в этом экземпляре. Затем информация может быть обработана с помощью grep / awk / wc и т. Д. Для создания отчетов и оповещений.

Я также делаю то же самое с запросом «работники», который показывает всех подключенных работников.

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

Сон должен держать соединение достаточно открытым для ответа.

Полный список административных команд и значения вывода приведены по адресу http://gearman.org/index.php?id=protocol Просто найдите «Административный протокол»

4 голосов
/ 30 апреля 2011

Чтобы расширить ответ d5ve, поскольку netcat будет сидеть и ждать в сокете, вы можете добавить параметр -w с максимальным количеством секунд для запуска. Так что если вы запрашиваете localhost:

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

... иначе вы никогда не вернетесь в командную строку.

1 голос
/ 21 июля 2010

Я думаю, тебе это нужно http://github.com/liorbk/php

1 голос
/ 04 мая 2010

Насколько я знаю, в gearman такого расширения нет, ответственность за управление и мониторинг рабочего сценария лежит на вас.

Supervisord - это приложение на Python для запуска приложений в фоновом режиме и мониторинга их.

ИЛИ вы можете использовать менеджер передач Брайана Муна

0 голосов
/ 09 января 2017

Когда все остальное терпит неудачу, вы можете использовать инструмент gearadmin, находящийся в пакете gearman-tools в Ubuntu, вызвав exec(), чтобы запустить его в новом процессе. Вот ссылка на его выходной формат .

Предполагается, что PHP и Gearman работают на одном сервере.

0 голосов
/ 14 июня 2014

В 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)

Примечание : вы должны установить пакет с именем "gearman", используя pip или easy_install, чтобы избежать любых исключений, запускающих приведенный выше код.

Кроме того, проверьте следующие клиенты администрирования, которые упрощают администрирование gearman в целом.

0 голосов
/ 26 июля 2013

Наткнулся сегодня, сам не проверял, но выглядит многообещающе.

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

0 голосов
/ 02 мая 2010
...