PHP Unconference Europe 2015

GearmanClient::doNormal

(No hay información de versión disponible, podría estar únicamente en SVN)

GearmanClient::doNormalEjecutar una única tarea y devolver un resultado

Descripción

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

Ejecuta una única tarea y devuelve una representación de tipo string del resultado. Es responsabilidad de GearmanClient y GearmanWorker ponerse de acuerdo en le formato del resultado.

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

Una representación de tipo string de los resultados de ejecutar una tarea.

Ejemplos

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

<?php

?>
<?php

# Código del cliente

echo "Iniciando\n";

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

# Añadir un servidor predeterminado (localhost).
$gmclient->addServer();

echo 
"Enviando el trabajo\n";

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

echo 
"Éxito: $result\n";

?>
<?php

echo "Iniciando\n";

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

# Añadir un servidor predeterminado (localhost).
$gmworker->addServer();

# Registrar la función "reverse" con el servidor. Cambiar la función trabajadora a
# "reverse_fn_fast" para un trabajador más rápido sin salida.
$gmworker->addFunction("reverse""reverse_fn");

print 
"Esperando al trabajo...\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:

Iniciando
Enviando el trabajo
Éxito: !aloH¡

Ejemplo #2 Enviar un trabajo y recuperar el estado incremental

Se envía un trabajo y el script itera para recuperar la información del estado. El trabajador posee una demora artificial que resulta en una ejecución más larga del trabajo y envía el estado y los datos durante el procesamiento. Cada llamada subsiguiente a GearmanClient::doNormal() producirá información de estado sobre el trabajo en ejecución.

<?php

# Código del cliente

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

# Añadir un servidor predeterminado (localhost).
$gmclient->addServer();

echo 
"Enviando el trabajo\n";

# Enviar el trabajo al revés
do
{
  
$result $gmclient->doNormal("reverse""¡Hola!");
  
# Verificar los paquetes devueltos y los errores.

  
switch($gmclient->returnCode())
  {
    case 
GEARMAN_WORK_DATA:
      echo 
"Datos: $result\n";
      break;
    case 
GEARMAN_WORK_STATUS:
      list(
$numerator$denominator)= $gmclient->doStatus();
      echo 
"Estado: $numerator/$denominator completo\n";
      break;
    case 
GEARMAN_WORK_FAIL:
      echo 
"Falló\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 
"Éxito: $result\n";

?>
<?php

# Código del trabajador

echo "Iniciando\n";

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

# Añadir un servidor predeterminado (localhost).
$gmworker->addServer();

# Registrar la función "reverse" con el servidor.
$gmworker->addFunction("reverse""reverse_fn");

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

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

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

  echo 
"Cantidad de trabajo: $workload ($workload_size)\n";

  
# Este bucle de estado no es necesario, simplemente muestra cómo funciona
  
for ($x0$x $workload_size$x++)
  {
    echo 
"Enviando el estado: " $x "/$workload_size completo\n";
    
$job->sendStatus($x+1$workload_size);
    
$job->sendData(substr($workload$x1));
    
sleep(1);
  }

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

  
# Devolver lo que queremos volver a enviar al cliente.
  
return $result;
}

?>

El resultado del ejemplo sería algo similar a:

Salida del trabajador:

Iniciando
Esperando el trabajo...
Trabajo recibido: H:foo.local:106
Cantidad de trabajo: ¡Hola! (6)
1/6 completo
2/6 completo
3/6 completo
4/6 completo
5/6 completo
6/6 completo
Resultado: !aloH!

Client output:

Iniciando
Enviando el trabajo
Estado: 1/6 completo
Data: ¡
Estado: 2/6 completo
Data: H
Estado: 3/6 completo
Data: o
Estado: 4/6 completo
Data: l
Estado: 5/6 completo
Data: a
Estado: 6/6 completo
Data: !
Éxito: !aloH!

Ver también

add a note add a note

User Contributed Notes 1 note

up
-1
fastest963 at gmail dot com
1 year ago
do() or doNormal() will block until the job is accepted by the worker. Looping is only necessary if you care about the response from the job. Use setTimeout() to control how long PHP will block.

If it does timeout, it throws a PHP Warning:
PHP Warning:  GearmanClient::do(): _client_do(GEARMAN_TIMEOUT) occured during gearman_client_run_tasks() -> libgearman/client.cc:174
To Top