PHP 8.3.4 Released!

GearmanClient::doNormal

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

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

Descripción

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

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 ($x= 0; $x < $workload_size; $x++)
{
echo
"Enviando el estado: " + $x + 1 . "/$workload_size completo\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}

$result= strrev($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

User Contributed Notes 2 notes

up
0
stanislav dot reshetnev at gmail dot com
9 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
11 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