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
"Sending job\n";

# Send reverse job
do
{
$result = $gmclient->doNormal("reverse", "Hello!");

# Check for various return packets and errors.
switch($gmclient->returnCode())
{
case
GEARMAN_WORK_DATA:
echo
"Data: $result\n";
break;
case
GEARMAN_WORK_STATUS:
list(
$numerator, $denominator)= $gmclient->doStatus();
echo
"Status: $numerator/$denominator complete\n";
break;
case
GEARMAN_WORK_FAIL:
echo
"Failed\n";
exit;
case
GEARMAN_SUCCESS:
echo
"Success: $result\n";
break;
default:
echo
"RET: " . $gmclient->returnCode() . "\n";
exit;
}
}
while(
$gmclient->returnCode() != GEARMAN_SUCCESS);

?>
<?php

echo "Starting\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
"Waiting for job...\n";
while(
$gmworker->work())
{
if (
$gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo
"return_code: " . $gmworker->returnCode() . "\n";
break;
}
}

function
reverse_fn($job)
{
echo
"Received job: " . $job->handle() . "\n";

$workload = $job->workload();
$workload_size = $job->workloadSize();

echo
"Workload: $workload ($workload_size)\n";

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

$result= strrev($workload);
echo
"Result: $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
Starting
Waiting for job...
Received job: H:foo.local:36
Workload: Hello! (6)
Sending status: 1/6 complete
Sending status: 2/6 complete
Sending status: 3/6 complete
Sending status: 4/6 complete
Sending status: 5/6 complete
Sending status: 6/6 complete
Result: !olleH
% php reverse_client.php
Starting
Sending job
Status: 1/6 complete
Status: 2/6 complete
Status: 3/6 complete
Status: 4/6 complete
Status: 5/6 complete
Status: 6/6 complete
Success: !olleH

add a note

User Contributed Notes 1 note

up
4
dmitriy dot baibuhtin at ya dot ru
8 years ago
An example of a client is invalid. Progress will not be displayed on the client side, as doNormal method is synchronous.
Code will be executed only after the completion doNormal.
<?php
case GEARMAN_WORK_STATUS:
list(
$numerator, $denominator)= $gmclient->doStatus();
echo
"Status: $numerator/$denominator complete\n";
break;
?>
To Top