GearmanClient::doBackground

(PECL gearman >= 0.5.0)

GearmanClient::doBackgroundEjecuta una tarea en segundo plano

Descripción

public GearmanClient::doBackground(string $function, string $workload, ?string $unique = null): string

Ejecuta una tarea en segundo plano, devuelve el gestor de trabajos que podrá ser utilizado para recuperar el estado de la tarea en curso.

Parámetros

function

Función registrada que ejecutará el worker

workload

Datos serializados a ser procesados

unique

ID único para identificar una tarea en particular

Valores devueltos

El gestor de trabajos para la tarea enviada.

Ejemplos

Ejemplo #1 Envía y supervisa un trabajo en segundo plano

El agente de este ejemplo tiene un retraso artificial introducido para simular un trabajo cuya ejecución tarda mucho tiempo. El script del cliente verifica periódicamente el estado del trabajo en curso.

<?php

/* Crea un cliente */
$gmclient= new GearmanClient();

/* Añade un servidor por omisión */
$gmclient->addServer();

/* Ejecuta el cliente */
$job_handle = $gmclient->doBackground("reverse", "this is a test");

if (
$gmclient->returnCode() != GEARMAN_SUCCESS)
{
echo
"Código de retorno erróneo\n";
exit;
}

$done = false;
do
{
sleep(3);
$stat = $gmclient->jobStatus($job_handle);
if (!
$stat[0]) // la tarea es conocida por lo que no está terminada
$done = true;
echo
"Ejecución : " . ($stat[1] ? "true" : "false") . ", numerador : " . $stat[2] . ", denominador : " . $stat[3] . "\n";
}
while(!
$done);

echo
"hecho !\n";

?>

El resultado del ejemplo sería algo similar a:

Ejecución : true, numerador : 3, denominador : 14
Ejecución : true, numerador : 6, denominador : 14
Ejecución : true, numerador : 9, denominador : 14
Ejecución : true, numerador : 12, denominador : 14
Ejecución : false, numerador : 0, denominador : 0
hecho !

Ver también

add a note

User Contributed Notes 1 note

up
8
felix at passcod dot name
7 years ago
Behaviour of the unique ID argument:

If it's not provided, it defaults to a UUIDv1 (timestamp + mac address).

Otherwise, if a job with the same unique ID exists (i.e. is either queued or currently executing), then that job is used, not the one you're submitting. This does not apply to past (completed) jobs, and works across the entire job server pool, assuming no partitioning.

Or with code (the values in [brackets] are the server-assigned job identifiers):

<?php

$gearman
->doBackground('sleep', '3', '123'); // [H:host:1] Starts sleep(3)
$gearman->doBackground('sleep', '5', '456'); // [H:host:2] Queues sleep(5)
$gearman->doBackground('sleep', '3', '123'); // [H:host:1] Does nothing
$gearman->doBackground('sleep', '1', '123'); // [H:host:1] Also does nothing (diff args don't trigger new jobs)

sleep (3);
// Job 123 [sleep(3)] has finished by now

$gearman->doBackground('sleep', '3', '123'); // [H:host:3] Starts a new job

?>
To Top