(PECL gearman >= 0.5.0)
GearmanClient::addTaskBackground — Ajoute une tâche d'arrière-plan pour une exécution en parallèle
$function_name
, string $workload
[, mixed &$context
[, string $unique
]] )Ajoute une tâche d'arrière-plan pour une exécution en parallèle d'autres tâches. Appelez cette méthode pour toutes les tâches à exécuter en parallèle, puis, appelez la méthode GearmanClient::runTasks() pour réaliser les tâches.
function_name
Une fonction enregistrée que le travailleur va exécuter
workload
Données linéarisées à analyser
context
Contexte de l'application à associer avec une tâche
unique
Un identifiant unique utilisé pour identifier une tâche particulière
Un objet GearmanTask ou FALSE
si la tâche
n'a pu être ajoutée.
Exemple #1 2 tâches dont une en arrière-plan
Cet exemple montre la différence entre l'exécution en arrière-plan et une exécution normale. Le client ajoute 2 tâches qui doivent exécuter la même fonction, mais une a été ajoutée avec la méthode addTaskBackground(). Une fonction de rappel est définie afin de surveiller la progression du travail. Un agent simple avec un délai artificiel rapporte la progression et le client la traite via la fonction de rappel. 2 agents sont exécutés dans cet exemple. Notez que la tâche en arrière-plan n'est pas affichée par le client.
<?php
# Le script client
# Crée un client Gearman
$gmc= new GearmanClient();
# Ajoute un serveur de travaux par défaut
$gmc->addServer();
# Définit 2 fonctions de rappel afin de surveiller la progression
$gmc->setCompleteCallback("reverse_complete");
$gmc->setStatusCallback("reverse_status");
# Ajoute une tâche pour la fonction "reverse"
$task= $gmc->addTask("reverse", "Hello World!", null, "1");
# Ajoute une autre tâche, mais cette fois, en arrière-plan
$task= $gmc->addTaskBackground("reverse", "!dlroW olleH", null, "2");
if (! $gmc->runTasks())
{
echo "ERREUR " . $gmc->error() . "\n";
exit;
}
echo "FAIT\n";
function reverse_status($task)
{
echo "STATUT : " . $task->unique() . ", " . $task->jobHandle() . " - " . $task->taskNumerator() .
"/" . $task->taskDenominator() . "\n";
}
function reverse_complete($task)
{
echo "TERMINÉ : " . $task->unique() . ", " . $task->data() . "\n";
}
?>
<?php
# Le script de l'agent
echo "Début\n";
# Crée un agent.
$gmworker= new GearmanWorker();
# Ajoute un serveur par défaut (localhost).
$gmworker->addServer();
# Enregistre la fonction "reverse" sur ce serveur.
$gmworker->addFunction("reverse", "reverse_fn");
print "Attente d'un travail...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}
function reverse_fn($job)
{
echo "Travail reçu : " . $job->handle() . "\n";
$workload = $job->workload();
$workload_size = $job->workloadSize();
echo "Charge de l'agent : $workload ($workload_size)\n";
# Cette boucle n'est pas nécessaire, mais permet de comprendre le fonctionnement
for ($x= 0; $x < $workload_size; $x++)
{
echo "Envoi du statut : " . ($x + 1) . "/$workload_size complete\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}
$result= strrev($workload);
echo "Résultat : $result\n";
# On retourne au client ce que l'on veut.
return $result;
}
?>
L'agent affiche, pour les 2 travaux :
Travail reçu : H:foo.local:65 Charge de l'agent : !dlroW olleH (12) 1/12 complete Travail reçu : H:foo.local:66 Charge de l'agent : Hello World! (12) Envoi du statut : 1/12 complete Envoi du statut : 2/12 complete Envoi du statut : 2/12 complete Envoi du statut : 3/12 complete Envoi du statut : 3/12 complete Envoi du statut : 4/12 complete Envoi du statut : 4/12 complete Envoi du statut : 5/12 complete Envoi du statut : 5/12 complete Envoi du statut : 6/12 complete Envoi du statut : 6/12 complete Envoi du statut : 7/12 complete Envoi du statut : 7/12 complete Envoi du statut : 8/12 complete Envoi du statut : 8/12 complete Envoi du statut : 9/12 complete Envoi du statut : 9/12 complete Envoi du statut : 10/12 complete Envoi du statut : 10/12 complete Envoi du statut : 11/12 complete Envoi du statut : 11/12 complete Envoi du statut : 12/12 complete Envoi du statut : 12/12 complete Résultat : !dlroW olleH Résultat : Hello World!
Affichage du client :
STATUT : 1, H:foo.local:66 - 1/12 STATUT : 1, H:foo.local:66 - 2/12 STATUT : 1, H:foo.local:66 - 3/12 STATUT : 1, H:foo.local:66 - 4/12 STATUT : 1, H:foo.local:66 - 5/12 STATUT : 1, H:foo.local:66 - 6/12 STATUT : 1, H:foo.local:66 - 7/12 STATUT : 1, H:foo.local:66 - 8/12 STATUT : 1, H:foo.local:66 - 9/12 STATUT : 1, H:foo.local:66 - 10/12 STATUT : 1, H:foo.local:66 - 11/12 STATUT : 1, H:foo.local:66 - 12/12 TERMINÉ : 1, !dlroW olleH FAIT