php - example - ¿Alguna forma de acceder a la administración de Gearman?
gearman php example (9)
Quiero poder consultar un servidor gearman 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 que manejen esas tareas, quiero poder) para enviar una alerta de salida.
¿Hay alguna manera de hacer esto?
También: accesorios si conoce una forma PHP para consultar el servidor gearman.
Edición : sé sobre la extensión de PHP gearman que está disponible de forma nativa, pero no estoy buscando una extensión de envío de tareas, necesito algo que me permita consultar el servidor de gearman y ver cuántos trabajadores están realizando una tarea específica.
Creo que necesitas este http://github.com/liorbk/php
Cuando todo lo demás falla, puede usar la herramienta gearadmin
que se encuentra en el paquete gearman-tools
en Ubuntu llamando a exec()
para ejecutarla en el nuevo proceso. Aquí hay una referencia a su formato de salida .
Esto supone que PHP y Gearman se ejecutan en el mismo servidor.
En Python puedes 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 : debe instalar el paquete llamado "gearman" usando pip o easy_install para evitar cualquier excepción que ejecute el código anterior.
Además, verifique los siguientes clientes de administración que simplifican la administración de gearman en general.
Me topé con eso hoy, no lo he probado, pero parece prometedor.
Para expandir la respuesta de d5ve, ya que netcat se sentará y esperará en el socket, puede agregar un parámetro -w con un número máximo de segundos para ejecutar. Así que si estás consultando localhost:
# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730 -w 1
... de lo contrario, nunca volver a un símbolo del sistema.
Para una comprobación rápida, utilizo este bash one-liner:
# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730
Esto abre una conexión a una instancia de gearman que se ejecuta en localhost 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 informar y alertar.
También hago lo mismo con la consulta de "trabajadores" que muestra a todos los trabajadores conectados.
# (echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
El modo de espera es mantener la conexión abierta el tiempo suficiente para la respuesta.
La lista completa de comandos administrativos, y lo que significa la salida, se encuentra en http://gearman.org/index.php?id=protocol Simplemente busque "Protocolo administrativo"
Por lo que sé, no hay una extensión de este tipo en gearman. Administrar y monitorear el script del trabajador es su responsabilidad. Puede probar uno de estos para este fin:
Supervisord es una aplicación de Python para ejecutar aplicaciones en segundo plano y monitorearlas.
O puedes usar el gerente de gearman de brian moon
Gearman tiene una extensión php . ¿Has mirado en eso todavía?
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;
}
}