GearmanClient::doNormal

(No version information available, might only be in Git)

GearmanClient::doNormalEjecuta una tarea y devuelve el resultado

Descripción

public GearmanClient::doNormal(string $function, string $workload, ?string $unique = null): string

Ejecuta una tarea y devuelve una string que representa el resultado. Corresponde a las clases GearmanClient y GearmanWorker aceptar el formato del resultado.

Parámetros

function

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 string que representa el resultado de la tarea ejecutada.

Ejemplos

Ejemplo #1 Envío de una tarea con retorno inmediato

<?php

?>
<?php

# Código del cliente

echo "Inicio\n";

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

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

echo
"Envío de la tarea\n";

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

echo
"Éxito: $result\n";

?>
<?php

echo "Inicio\n";

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

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

# Registro de la función "reverse" con el servidor. Modifica la función worker
# a "reverse_fn_fast" para un worker más rápido sin salida.
$gmworker->addFunction("reverse", "reverse_fn");

print
"Esperando una tarea...\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:

Inicio
Envío de la tarea
Éxito: !olleH

Ejemplo #2 Envío de una tarea y recuperación incremental del estado

Una tarea es enviada y el script se ejecuta en bucle para recuperar las informaciones de estado. El worker tiene un retraso artificial que lo convierte en una tarea larga y envía el estado y los datos cuando la ejecución ocurre. Cada subllamada a la función GearmanClient::doNormal() produce informaciones de estado sobre la tarea en curso.

<?php

# Código del cliente

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

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

echo
"Envío de la tarea\n";

# Envío de la tarea reverse
do
{
$result = $gmclient->doNormal("reverse", "Hello!");
# Verifica los paquetes devueltos así como 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 completado\n";
break;
case
GEARMAN_WORK_FAIL:
echo
"Fallo\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 worker

echo "Inicio\n";

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

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

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

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

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

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

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

# Este bucle de estado no es necesario, solo muestra cómo funciona
for ($x= 0; $x < $workload_size; $x++)
{
echo
"Envío del estado: " + $x + 1 . "/$workload_size completado\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}

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

# Devuelve lo que se desea devolver al cliente.
return $result;
}

?>

El resultado del ejemplo sería algo similar a:

Salida del worker:

Inicio
Esperando una tarea...
Tarea recibida: H:foo.local:106
Workload: Hello! (6)
1/6 completado
2/6 completado
3/6 completado
4/6 completado
5/6 completado
6/6 completado
Resultado: !olleH

Salida del cliente:

Inicio
Envío de la tarea
Estado: 1/6 completado
Datos: H
Estado: 2/6 completado
Datos: e
Estado: 3/6 completado
Datos: l
Estado: 4/6 completado
Datos: l
Estado: 5/6 completado
Datos: o
Estado: 6/6 completado
Datos: !
Éxito: !olleH

Ver también

add a note

User Contributed Notes 2 notes

up
0
stanislav dot reshetnev at gmail dot com
10 years ago
doNormal don't work in version php_gearman 0.8.3:

PHP Fatal error: Call to undefined method GearmanClient::doNormal()

But it exist in version 1.1.2.
up
-2
fastest963 at gmail dot com
12 years 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