SunshinePHP Developer Conference 2015

GearmanClient::do

(PECL gearman >= 0.5.0)

GearmanClient::doEjecuta una sola tarea y retorna el resultado [obsoleto]

Descripción

public string GearmanClient::do ( string $function_name , string $workload [, string $unique ] )

El método GearmanClient::do() es obsoleto desde pecl/gearman 1.0.0. Use GearmanClient::doNormal().

Parámetros

function_name

Función registrada que ejecutará el worker

workload

Datos serializados a ser procesados

unique

ID único para identificar una tarea en particular

Valores devueltos

Un string representando el resultado de la tarea ejecutada.

Ejemplos

Ejemplo #1 Envío de un trabajo con retorno inmediato

<?php

# Código del cliente

echo "Starting\n";

# Creación del objeto cliente
$gmclient= new GearmanClient();

# Adición del servidor por defecto (localhost).
$gmclient->addServer();

echo 
"Sending job\n";

$result $gmclient->doNormal("reverse""Hello!");

echo 
"Success: $result\n";

?>
<?php

echo "Starting\n";

# Creación del objeto trabajador
$gmworker= new GearmanWorker();

# Adición del servidor por defecto (localhost).
$gmworker->addServer();

# Registra la función "reverse" en el servidor. Cambiar la función del trabajador
# a "reverse_fn_fast" para usar un trabajar más rápido que no genera salida.
$gmworker->addFunction("reverse""reverse_fn");

print 
"Waiting for job...\n";
while(
$gmworker->work())
{
  if (
$gmworker->returnCode() != GEARMAN_SUCCESS)
  {
    echo 
"return_code: " $gmworker->returnCode() . "\n";
    break;
  }
}

function 
reverse_fn($job)
{
  return 
strrev($job->workload());
}

?>

El resultado del ejemplo sería algo similar a:

Starting
Sending job
Success: !olleH

Ejemplo #2 Envío de un trabajo y obtención del estado incremental

Se envía un trabajo y el script comprueba constantemente mediante un bucle la información de estado. El trabajador tiene un retardo artificial que provoca un trabajo de larga duración y envía el estado y datos según se van procesando. Cada llamada a GearmanClient::do() produce información de estado del trabajo en ejecución.

<?php

# Código del cliente

# Creamos el objeto cliente
$gmclient= new GearmanClient();

# Añadimos el servidor por defecto (localhost).
$gmclient->addServer();

echo 
"Sending job\n";

# Enviamos trabajo "reverse"
do
{
  
$result $gmclient->doNormal("reverse""Hello!");
  
# Comprobamos llegada de posibles paquetes y errores
  
  
switch($gmclient->returnCode())
  {
    case 
GEARMAN_WORK_DATA:
      echo 
"Data: $result\n";
      break;
    case 
GEARMAN_WORK_STATUS:
      list(
$numerator$denominator)= $gmclient->doStatus();
      echo 
"Status: $numerator/$denominator complete\n";
      break;
    case 
GEARMAN_WORK_FAIL:
      echo 
"Failed\n";
      exit;
    case 
GEARMAN_SUCCESS:
      break;
    default:
      echo 
"RET: " $gmclient->returnCode() . "\n";
      echo 
"Error: " $gmclient->error() . "\n";
      echo 
"Errno: " $gmclient->getErrno() . "\n";
      exit;
  }
}
while(
$gmclient->returnCode() != GEARMAN_SUCCESS);

echo 
"Success: $result\n";

?>
<?php

# Código del trabajador

echo "Starting\n";

# Creamos el objeto trabajador
$gmworker= new GearmanWorker();

# Añadimos servidor por defecto (localhost).
$gmworker->addServer();

# Registramos la función "reverse" en el servidor
$gmworker->addFunction("reverse""reverse_fn");

print 
"Waiting for job...\n";
while(
$gmworker->work())
{
  if (
$gmworker->returnCode() != GEARMAN_SUCCESS)
  {
    echo 
"return_code: " $gmworker->returnCode() . "\n";
    break;
  }
}

function 
reverse_fn($job)
{
  echo 
"Received job: " $job->handle() . "\n";

  
$workload $job->workload();
  
$workload_size $job->workloadSize();

  echo 
"Workload: $workload ($workload_size)\n";

  
# Este bucle para comprobar el estado no es necesario, tan sólo muestra como funciona
  
for ($x0$x $workload_size$x++)
  {
    echo 
"Sending status: " $x "/$workload_size complete\n";
    
$job->sendStatus($x+1$workload_size);
    
$job->sendData(substr($workload$x1));
    
sleep(1);
  }

  
$resultstrrev($workload);
  echo 
"Result: $result\n";

  
# Retornamos lo que queremos enviar al cliente
  
return $result;
}

?>

El resultado del ejemplo sería algo similar a:

Worker output:

Starting
Waiting for job...
Received job: H:foo.local:106
Workload: Hello! (6)
1/6 complete
2/6 complete
3/6 complete
4/6 complete
5/6 complete
6/6 complete
Result: !olleH

Client output:

Starting
Sending job
Status: 1/6 complete
Data: H
Status: 2/6 complete
Data: e
Status: 3/6 complete
Data: l
Status: 4/6 complete
Data: l
Status: 5/6 complete
Data: o
Status: 6/6 complete
Data: !
Success: !olleH

Ver también

add a note add a note

User Contributed Notes 1 note

up
1
Shane Harter
4 years ago
Note that this isn't blocking -- that do() will return as soon as the job is accepted by the Gearman jobserver.

That lets you do..while until the return code is success or failure as you see in the examples.
To Top