Ejemplo #1 Cliente y trabajador básicos, enviando tareas

En este ejemplo, se extiende el cliente básico que da la vuelta al texto para ejecutar dos tareas en paralelo. El trabajador "reverse" es idéntico excepto la parte del envío del datos durante el proceso.

<?php

# Creación del cliente Gearman
$gmc= new GearmanClient();

# Añade el servidor por defecto (localhost)
$gmc->addServer();

# Registra alguna llamadas de retorno
$gmc->setCreatedCallback("reverse_created");
$gmc->setDataCallback("reverse_data");
$gmc->setStatusCallback("reverse_status");
$gmc->setCompleteCallback("reverse_complete");
$gmc->setFailCallback("reverse_fail");

# Asignación de datos arbitrarios para la aplicación
$data['foo'] = 'bar';

# Añade dos tareas
$task= $gmc->addTask("reverse", "foo", $data);
$task2= $gmc->addTaskLow("reverse", "bar", NULL);

# Ejecuta las tareas en paralelo (se asumen múltiples trabajadores)
if (! $gmc->runTasks())
{
echo
"ERROR " . $gmc->error() . "\n";
exit;
}

echo
"DONE\n";

function
reverse_created($task)
{
echo
"CREATED: " . $task->jobHandle() . "\n";
}

function
reverse_status($task)
{
echo
"STATUS: " . $task->jobHandle() . " - " . $task->taskNumerator() .
"/" . $task->taskDenominator() . "\n";
}

function
reverse_complete($task)
{
echo
"COMPLETE: " . $task->jobHandle() . ", " . $task->data() . "\n";
}

function
reverse_fail($task)
{
echo
"FAILED: " . $task->jobHandle() . "\n";
}

function
reverse_data($task)
{
echo
"DATA: " . $task->data() . "\n";
}

?>
<?php

echo "Starting\n";

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

# Añade el servidor por defecto (localhost).
$gmworker->addServer();

# Registra la función "reverse" en el servidor. Cambiar la función a
# "reverse_fn_fast" para obtener un worker más rápido que no genera
# informacion del proceso
$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 de estado no es necesario, sólo es para mostrar cómo 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 de vuelta al cliente
return $result;
}

# Una versión mucho más sencilla y que muestra menos información del proceso sería:
function reverse_fn_fast($job)
{
return
strrev($job->workload());
}

?>

El resultado del ejemplo sería algo similar a:

 % php reverse_worker.php Starting Waiting for job... Received job: H:foo.local:45 Workload: foo (3) 1/3 complete 2/3 complete 3/3 complete Result: oof Received job: H:foo.local:44 Workload: bar (3) 1/3 complete 2/3 complete 3/3 complete Result: rab 
 % php reverse_client_task.php CREATED: H:foo.local:44 CREATED: H:foo.local:45 STATUS: H:foo.local:45 - 1/3 DATA: f STATUS: H:foo.local:45 - 2/3 DATA: o STATUS: H:foo.local:45 - 3/3 DATA: o COMPLETE: H:foo.local:45, oof STATUS: H:foo.local:44 - 1/3 DATA: b STATUS: H:foo.local:44 - 2/3 DATA: a STATUS: H:foo.local:44 - 3/3 DATA: r COMPLETE: H:foo.local:44, rab DONE 
To Top