Utilisation simple

Exemple #1 Client et agent Gearman simple

Cet exemple montre un client et un agent simple. Le client envoie une chaîne de caractères au serveur de travaux, et l'agent inverse la chaîne de caractères et la retourne. Le travail est exécuté de façon synchronisée.

<?php

# Crée un nouveau client.
$gmclient= new GearmanClient();

# Ajoute un serveur par défaut (localhost).
$gmclient->addServer();

echo
"Envoi de la tâche\n";

# Envoi de la tâche inverse
do
{
$result = $gmclient->doNormal("reverse", "Hello!");

# Vérification des différents paquets de retour et des erreurs.
switch($gmclient->returnCode())
{
case
GEARMAN_WORK_DATA:
echo
"Données : $result\n";
break;
case
GEARMAN_WORK_STATUS:
list(
$numerator, $denominator)= $gmclient->doStatus();
echo
"Statut : $numerator/$denominator terminé\n";
break;
case
GEARMAN_WORK_FAIL:
echo
"Échec\n";
exit;
case
GEARMAN_SUCCESS:
echo
"Succès : $result\n";
break;
default:
echo
"RET : " . $gmclient->returnCode() . "\n";
exit;
}
}
while(
$gmclient->returnCode() != GEARMAN_SUCCESS);

?>
<?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" avec le serveur. Modifie la fonction
# de l'agent en "reverse_fn_fast" pour en améliorer la rapidité avec aucun 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 travail : $workload ($workload_size)\n";

# Cette boucle n'est pas nécessaire, mais montre simplement le fonctionnement
for ($x= 0; $x < $workload_size; $x++)
{
echo
"Envoi du statut : " . ($x + 1) . "/$workload_size terminé\n";
$job->sendStatus($x, $workload_size);
sleep(1);
}

$result= strrev($workload);
echo
"Résultat : $result\n";

# On retourne ce que l'on veut au client.
return $result;
}

# Une version plus simple et moins verbeuse de la fonction ci-dessus pourrait être :
function reverse_fn_fast($job)
{
return
strrev($job->workload());
}

?>

Résultat de l'exemple ci-dessus est similaire à :

% php reverse_worker.php
Début
Attente d'un travail...
Travail reçu : H:foo.local:36
Charge de travail : Hello! (6)
Envoi du statut : 1/6 terminé
Envoi du statut : 2/6 terminé
Envoi du statut : 3/6 terminé
Envoi du statut : 4/6 terminé
Envoi du statut : 5/6 terminé
Envoi du statut : 6/6 terminé
Résultat : !olleH
% php reverse_client.php
Début
Envoi de la tâche
Statut : 1/6 terminé
Statut : 2/6 terminé
Statut : 3/6 terminé
Statut : 4/6 terminé
Statut : 5/6 terminé
Statut : 6/6 terminé
Succès : !olleH