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.
(PECL gearman >= 0.5.0)
GearmanClient::do — Ejecuta una sola tarea y retorna el resultado [obsoleto]
El método GearmanClient::do() es obsoleto desde pecl/gearman 1.0.0. Use GearmanClient::doNormal().
function_name
Función registrada que ejecutará el worker
workload
Datos serializados a ser procesados
unique
ID único para identificar una tarea en particular
Un string representando el resultado de la tarea ejecutada.
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 ($x= 0; $x < $workload_size; $x++)
{
echo "Sending status: " + $x + 1 . "/$workload_size complete\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}
$result= strrev($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
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.