2010-05-02 3 views
25

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

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

также:.? Mad реквизита, если вы знаете PHP способ запроса сервер Gearman

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

ответ

34
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; 
    } 

} 
+0

Awesomeeeeeeeee –

+4

^Что он сказал. – tambler

0

Gearman has a php extension. Вы уже изучили это?

PHP Link

+1

Это относится к задаче. Я уже использую это, это расширение не предоставляет никакого доступа к административной стороне gearman –

1

Насколько я знаю, нет такого расширения в Gearman, управление и контроль рабочий сценарий ваша ответственность, вы можете попробовать один из них для этой цели -

Supervisord является питон appliation для запускать приложение в фоновом режиме и контролировать их.

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

+0

Я думаю, мне придется придумать какую-то систему сердечных сокращений. –

25

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

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

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

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

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

Сон заключается в том, чтобы открыть соединение достаточно долго для ответа.

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

+0

Очень приятно, мне нравится, насколько просто это решение. –

4

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

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

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

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) 

Примечание: вы должны установить пакет под названием «Gearman» с помощью пип или easy_install, чтобы избежать каких-либо исключений выполнения кода.

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

0

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

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

Смежные вопросы