Exemple #1 Client et agent Gearman simple, avec la soumission de tâches
<?php # Crée un client gearman $gmc= new GearmanClient(); # Ajoute un serveur par défaut (localhost) $gmc->addServer(); # Enregistre quelques fonctions de rappel $gmc->setCreatedCallback("reverse_created"); $gmc->setDataCallback("reverse_data"); $gmc->setStatusCallback("reverse_status"); $gmc->setCompleteCallback("reverse_complete"); $gmc->setFailCallback("reverse_fail"); # Définit quelques données arbitraires pour l'application $data['foo'] = 'bar'; # Ajoute 2 tâches $task= $gmc->addTask("reverse", "foo", $data); $task2= $gmc->addTaskLow("reverse", "bar", NULL); # Exécute les tâches en parallèle (en assumant plusieurs agents) if (! $gmc->runTasks()) { echo "ERREUR " . $gmc->error() . "\n"; exit; } echo "Fait !\n"; function reverse_created($task) { echo "Créé : " . $task->jobHandle() . "\n"; } function reverse_status($task) { echo "STATUT : " . $task->jobHandle() . " - " . $task->taskNumerator() . "/" . $task->taskDenominator() . "\n"; } function reverse_complete($task) { echo "TERMINÉ : " . $task->jobHandle() . ", " . $task->data() . "\n"; } function reverse_fail($task) { echo "ÉCHEC : " . $task->jobHandle() . "\n"; } function reverse_data($task) { echo "DONNÉES : " . $task->data() . "\n"; } ?>
<?php echo "Début\n"; # Crée un nouvel agent. $gmworker= new GearmanWorker(); # Ajoute un serveur par défaut (localhost). $gmworker->addServer(); # Enregistre la fonction "reverse" avecle serveur. Modifie la fonction de l'agent en # "reverse_fn_fast" pour être plus rapide sans affichage. $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 nous l'utilisons pour en 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"; # Retourne ce que l'on veut au client. return $result; } # Une version plus simple et moins vebeuse de la fonction ci-dessus serait : function reverse_fn_fast($job) { return strrev($job->workload()); } ?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
% php reverse_worker.php Début Attente d'un travail... Travail reçu : H:foo.local:45 Charge de l'agent : foo (3) 1/3 complete 2/3 complete 3/3 complete Result: oof Travail reçu : H:foo.local:44 Charge de l'agent : bar (3) 1/3 complete 2/3 complete 3/3 complete Résultat : rab
% php reverse_client_task.php Créé : H:foo.local:44 Créé : H:foo.local:45 STATUT : H:foo.local:45 - 1/3 DONNÉES : f STATUT : H:foo.local:45 - 2/3 DONNÉES : o STATUT : H:foo.local:45 - 3/3 DONNÉES : o TERMINÉ : H:foo.local:45, oof STATUT : H:foo.local:44 - 1/3 DONNÉES : b STATUT : H:foo.local:44 - 2/3 DONNÉES : a STATUT : H:foo.local:44 - 3/3 DONNÉES : r TERMINÉ : H:foo.local:44, rab FAIT