CakeFest 2024: The Official CakePHP Conference

GearmanClient::doBackground

(PECL gearman >= 0.5.0)

GearmanClient::doBackgroundEjecuta una tarea en segundo plano

Descripción

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

Ejecuta una tarea en segundo plano, retornando el manejador del trabajo que puede ser usado para obtener el estado de la tarea en ejecución.

Parámetros

function_name

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 manejador de la tarea enviada.

Ejemplos

Ejemplo #1 Envío y monitorización de un trabajo en segundo plano

El trabajador de este ejemplo tiene un retardo artificial introducido para imitar un trabajo de larga duración. El script cliente comprueba periódicamente el estado del trabajo en ejecución.

<?php

/* Creamos nuestro objeto */
$gmclient= new GearmanClient();

/* Añade el servidor por defecto */
$gmclient->addServer();

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

if (
$gmclient->returnCode() != GEARMAN_SUCCESS)
{
echo
"bad return code\n";
exit;
}

$done = false;
do
{
sleep(3);
$stat = $gmclient->jobStatus($job_handle);
if (!
$stat[0]) // el trabajo se conoce, así que no se hace
$done = true;
echo
"Running: " . ($stat[1] ? "true" : "false") . ", numerator: " . $stat[2] . ", denominator: " . $stat[3] . "\n";
}
while(!
$done);

echo
"done!\n";

?>

El resultado del ejemplo sería algo similar a:

Running: true, numerator: 3, denominator: 14
Running: true, numerator: 6, denominator: 14
Running: true, numerator: 9, denominator: 14
Running: true, numerator: 12, denominator: 14
Running: false, numerator: 0, denominator: 0
done!

Ver también

add a note

User Contributed Notes 1 note

up
7
felix at passcod dot name
6 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