&reftitle.examples;
Utilisation simple Client et agent Gearman simple Cet exemple montre un client et un agent simple. Le client envoie une &string; au serveur de travaux, et l'agent inverse la &string; et la retourne. Le travail est exécuté de façon synchronisée. addServer(); echo "Envoie du travail\n"; # Envoie le travail d'inversion do { $result = $gmclient->doNormal("reverse", "Hello!"); # Vérifie les paquets et les erreurs retournés. 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 complete\n"; break; case GEARMAN_WORK_FAIL: echo "Échec\n"; exit; case GEARMAN_SUCCESS: echo "Succès: $result\n"; break; default: echo "Code retourné : " . $gmclient->returnCode() . "\n"; exit; } } while($gmclient->returnCode() != GEARMAN_SUCCESS); ?> ]]> 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 l'agent : $workload ($workload_size)\n"; # Cette boucle n'est pas nécessaire, mais montre simplement le fonctionnement for ($x= 0; $x < $workload_size; $x++) { echo "Envoie du statut : " . ($x + 1) . "/$workload_size complete\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()); } ?> ]]> &example.outputs.similar;
Client et agent Gearman simple, en arrière-plan Cet exemple montre un client et un agent simple. Le client envoie une &string; au serveur de travaux en tant que travail d'arrière-plan, et l'agent renverse la &string;. Notez que vu l'exécution asynchrone de l'agent, le client n'attend pas la fin et qu'il sort (y compris lorsqu'il ne reçoit pas les résultats). addServer(); # Exécute le client en arrière-plan $job_handle = $gmclient->doBackground("reverse", "this is a test"); if ($gmclient->returnCode() != GEARMAN_SUCCESS) { echo "Mauvais code retour\n"; exit; } echo "fait !\n"; ?> ]]> addServer(); # Enregistre la fonction "reverse" sur le serveur. Modifie la fonction de l'agent en # "reverse_fn_fast" pour une exécution 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, $workload_size); 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()); } ?> ]]> &example.outputs.similar;
Client et agent Gearman simple, avec la soumission de tâches Dans cet exemple, le client "reverse" a été étendu pour exécuter 2 tâches en parallèle. L'agent "reverse" est inchangé, mis à part qu'il retourne des données durant le processus. 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"; } ?> ]]> 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()); } ?> ]]> &example.outputs.similar;