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.
(No version information available, might only be in Git)
GearmanClient::doNormal — Ejecuta una tarea y devuelve el resultado
Ejecuta una tarea y devuelve una string que representa el resultado. Corresponde a las clases GearmanClient y GearmanWorker aceptar el formato del resultado.
function
Función registrada que ejecutará el worker
workload
Datos serializados a ser procesados
unique
ID único para identificar una tarea en particular
Una string que representa el resultado de la tarea ejecutada.
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
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.
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