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 — Ejecutar una única tarea y devolver un resultado
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.
function_name
Función registrada que ejecutará el worker
workload
Datos serializados a ser procesados
unique
ID único para identificar una tarea en particular
Una representación de tipo string de los resultados de ejecutar una tarea.
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!
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