Note that this isn't blocking -- that do() will return as soon as the job is accepted by the Gearman jobserver.
That lets you do..while until the return code is success or failure as you see in the examples.
(PECL gearman >= 0.5.0)
GearmanClient::do — Executa uma única tarefa e retorna um resultado (descontinuado)
O método GearmanClient::do() foi descontinuado a partir do pecl/gearman 1.0.0. Use GearmanClient::doNormal().
function_name
Uma função registrada que o trabalhador deve executar
workload
Dados serializados a serem processados
unique
Um identificador único usado para identificar uma tarefa específica
Uma string que representa os resultados da execução de uma tarefa.
Exemplo #1 Envio de tarefa simples com retorno imediato
<?php
# Código do cliente
echo "Começando\n";
# Cria nosso objeto cliente.
$gmclient= new GearmanClient();
# Adiciona servidor padrão (localhost).
$gmclient->addServer();
echo "Enviando tarefa\n";
$result = $gmclient->doNormal("reverse", "Hello!");
echo "Sucesso: $result\n";
?>
<?php
echo "Começando\n";
# Cria nosso objeto trabalhador.
$gmworker= new GearmanWorker();
# Adiciona servidor padrão (localhost).
$gmworker->addServer();
# Registra a função "reversa" com o servidor. Altera a função do trabalhador para
# "reverse_fn_fast" para um trabalhador mais rápido sem saída.
$gmworker->addFunction("reverse", "reverse_fn");
print "Esperando tarefa...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "Código de retorno:" . $gmworker->returnCode() . "\n";
break;
}
}
function reverse_fn($job)
{
return strrev($job->workload());
}
?>
O exemplo acima produzirá algo semelhante a:
Começando Enviando tarefa Sucesso: !olleH
Exemplo #2 Enviando um trabalho e recuperando status incremental
Um trabalho é enviado e o script faz um laço para recuperar informações de status. O trabalhador tem um atraso artificial que resulta em um trabalho de longa execução e envia status e dados conforme o processamento ocorre. Cada chamada subsequente a GearmanClient::do() produz informações de status na tarefa em execução.
<?php
# Código do cliente
# Cria nosso objeto cliente.
$gmclient= new GearmanClient();
# Adiciona servidor padrão (localhost).
$gmclient->addServer();
echo "Enviando tarefa\n";
# Envia tarefa reversa
do
{
$result = $gmclient->doNormal("reverse", "Hello!");
# Verifica vários pacotes de retorno e erros.
switch($gmclient->returnCode())
{
case GEARMAN_WORK_DATA:
echo "Dados: $result\n";
break;
case GEARMAN_WORK_STATUS:
list($numerator, $denominator)= $gmclient->doStatus();
echo "Status: $numerator/$denominator concluído\n";
break;
case GEARMAN_WORK_FAIL:
echo "Falhou\n";
exit;
case GEARMAN_Sucesso:
break;
default:
echo "RET: " . $gmclient->returnCode() . "\n";
echo "Error: " . $gmclient->error() . "\n";
echo "Errno: " . $gmclient->getErrno() . "\n";
exit;
}
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);
echo "Sucesso: $result\n";
?>
<?php
# Código do trabalhador
echo "Começando\n";
# Cria nosso objeto trabalhador.
$gmworker= new GearmanWorker();
# Adiciona servidor padrão (localhost).
$gmworker->addServer();
# Registra a função "reversa" com o servidor.
$gmworker->addFunction("reverse", "reverse_fn");
print "Esperando tarefa...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "Código de retorno:" . $gmworker->returnCode() . "\n";
break;
}
}
function reverse_fn($job)
{
echo "Tarefa recebida: " . $job->handle() . "\n";
$workload = $job->workload();
$workload_size = $job->workloadSize();
echo "Carga de trabalho: $workload ($workload_size)\n";
# Este laço de status não é necessário, apenas mostra como ele funciona
for ($x= 0; $x < $workload_size; $x++)
{
echo "Status de envio: " + $x + 1 . "/$workload_size concluído\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}
$result= strrev($workload);
echo "Resultado: $result\n";
# Retorna o que queremos enviar de volta ao cliente.
return $result;
}
?>
O exemplo acima produzirá algo semelhante a:
Worker output:
Começando Esperando tarefa... Tarefa recebida: H:foo.local:106 Carga de trabalho: Hello! (6) 1/6 concluído 2/6 concluído 3/6 concluído 4/6 concluído 5/6 concluído 6/6 concluído Resultado: !olleH
Client output:
Começando Enviando tarefa Status: 1/6 concluído Dados: H Status: 2/6 concluído Dados: e Status: 3/6 concluído Dados: l Status: 4/6 concluído Dados: l Status: 5/6 concluído Dados: o Status: 6/6 concluído Dados: ! Sucesso: !olleH
Note that this isn't blocking -- that do() will return as soon as the job is accepted by the Gearman jobserver.
That lets you do..while until the return code is success or failure as you see in the examples.