2010-05-02 11 views
25

Quiero poder consultar un servidor de engranaje para determinar cuántas instancias de un trabajador tengo en ejecución (básicamente quiero asegurarme de que RunTaskA esté disponible y RunTaskB esté disponible si no hay trabajadores manejando esas tareas, quiero ser capaz de enviar una alerta a cabo¿Alguna forma de acceder a la administración de Gearman?

¿hay alguna manera de hacer esto

también:.? puntales Mad si usted sabe de una manera PHP para consultar el servidor gearman

Editar:. I saber acerca de la extensión de Gearman PHP que está disponible de forma nativa, pero no estoy buscando una tas k extensión de envío, necesito algo que me permita consultar el servidor de engranaje y ver cuántos trabajadores están desempeñando una tarea específica.

Respuesta

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

^Lo que dijo. – tambler

0

Gearman has a php extension. ¿Ya investigaste eso?

PHP Link

+1

Eso es para enviar tareas. Ya estoy usando eso, esa extensión no proporciona ningún acceso al lado administrativo de Gearman –

1

Por lo que yo sé no hay tal extensión en gearman, Gestión y supervisión de la escritura del trabajador es su responsabilidad puede probar uno de estos para este propósito -

Supervisord es un appliation pitón de ejecutar la aplicación en segundo plano y supervisarlos.

o puede utilizar de Brian Luna gearman manager

+0

Supongo que tendré que idear algún tipo de sistema de latido. –

25

Para verificar de manera rápida, utilizo esta fiesta de una sola línea:

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

Esto abre una conexión a una instancia gearman que se ejecuta en la máquina local y envía la consulta de "estado". Esto contiene el nombre y el número de trabajos en esa instancia. La información se puede procesar con grep/awk/wc, etc. para informes y alertas.

También hago lo mismo con la consulta de "trabajadores" que muestra todos los trabajadores conectados.

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

El sueño es mantener la conexión abierta el tiempo suficiente para la respuesta.

La lista completa de los comandos de administración, y lo que significa que la salida es a las http://gearman.org/index.php?id=protocol sólo la búsqueda de "Protocolo Administrativo"

+0

Muy bien, me gusta lo simple que es esta solución. –

4

Para ampliar la respuesta de d5ve, ya que netcat se siéntese y espere en el zócalo, puede agregar un parámetro -w con un número máximo de segundos para ejecutar. Por lo tanto, si consulta localhost:

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

... de lo contrario, nunca volverá al símbolo del sistema.

0

En Python que podría hacer lo siguiente:

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) 

Nota: usted tiene que instalar el paquete llamado "gearman" usando PIP o easy_install para evitar cualquier excepción que ejecutan el código de seguridad.

Además, compruebe los siguientes clientes de administración que simplifican la administración de Gearman en general.

0

Cuando todo lo demás falla, puede utilizar la herramienta gearadmin encuentra en el paquete gearman-tools en Ubuntu llamando exec() para ejecutarlo en el nuevo proceso. Aquí está a reference to its output format.

Esto supone que PHP y Gearman se están ejecutando en el mismo servidor.

Cuestiones relacionadas