2011-04-14 5 views
5

Tengo un servidor de Gearman ejecutando un proceso que tarda unos minutos en terminar. Estoy ejecutando una barra de progreso para mostrar la finalización, y estoy tratando de obtener los porcentajes para la barra usando la extensión Gearman PHP y la función jobStatus().Problema con el estado de trabajo de Gearman

El trabajo está definitivamente activo y encontrado, ya que los primeros dos campos (conocidos + aún en ejecución) vuelven a ser verdaderos. Sin embargo, los campos tercero y cuarto (numerador y denominador del porcentaje de finalización) regresan sin nada. ¿Alguien sabe por qué esto podría ser o cómo se calculan estos números?

Respuesta

3
public bool GearmanJob::sendStatus (int $numerator , int $denominator) 

envía información de estado para el servidor de trabajo y cualquier cliente de escucha. Use esto para especificar qué porcentaje del trabajo se ha completado.

Para poder usarlo, probablemente también tendrá que modificar un poco el cliente para manejar la comunicación.

Ejemplo

client.php

<?php 
global $argc,$argv; 

if (!file_exists($argv[1])) { 
     echo "File not found\n"; 
     exit(1); 
} 

$gmclient= new GearmanClient(); 
$gmclient->addServer(); 
do 
{ 
    $result = $gmclient->do("linecount", file_get_contents($argv[1])); 
    # Check for various return packets and errors. 

    switch($gmclient->returnCode()) 
    { 
    case GEARMAN_WORK_STATUS: 
     list($numerator, $denominator)= $gmclient->doStatus(); 
     echo "Status: " . sprintf("%d%%",($numerator/$denominator)*100) 
      . " complete\r"; 
     break; 
    case GEARMAN_SUCCESS: 
     break; 
    } 
} 
while($gmclient->returnCode() != GEARMAN_SUCCESS); 

echo "\nResult: $result\n"; 

worker.php

<?php 
$worker= new GearmanWorker(); 
$worker->addServer(); 
$worker->addFunction("linecount", "linecount"); 
while ($worker->work()); 

    function linecount($job) 
    { 
      $lines = preg_split('/[\r\n]/', 
         $job->workload(),null,PREG_SPLIT_NO_EMPTY); 
      $linecount = count($lines); 
      $n = 0; 
      foreach ($lines as $line) { 
        usleep(3000); 
        $n++; 
        $job->sendStatus($n,$linecount); 
        $ret++; 
      } 
      return $ret; 
    } 
+0

¿Está funcionando este código? lo pruebo sin ningún éxito – slier

+0

Se probó una vez y se encontró en buen estado junto con gearmand 0,20 en 2011. Ahora que se lanzó gearmand 1.2, es probable que haya cambios en la API entre esos dos lanzamientos. –

+0

u ¿logras obtener el estado en el cliente? la mía no funciona para nada ... la apliageman apenas cambia ... el código funciona bien ... solo me pregunto si tengo una instalación incorrecta del engranaje – slier

0

¿El trabajador está configurado para devolver el estado?

Si las escribe usted mismo tiene que hacer un poco de trabajo extra para que devuelvan los detalles a medida que avanzan.

+0

Ah, muchas gracias, no sabía que el trabajador necesita para ser configurado. ¿Algún recurso que pueda señalar sobre cómo configurar exactamente el trabajador? –

+0

¿Escribiste el paquete tú mismo? Cuando recibe un trabajo, puede devolver el estado: http://www.php.net/manual/en/gearmanjob.sendstatus.php – preinheimer

Cuestiones relacionadas