GearmanClient::doNormal

(No version information available, might only be in Git)

GearmanClient::doNormalExecuta uma única tarefa e retorna um resultado

Descrição

public GearmanClient::doNormal(string $function, string $workload, ?string $unique = null): string

Executa uma única tarefa e retorna uma representação de string do resultado. Cabe ao GearmanClient e ao GearmanWorker concordar com o formato do resultado.

Parâmetros

function

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

Valor Retornado

Uma string que representa os resultados da execução de uma tarefa.

Exemplos

Exemplo #1 Envio de tarefa simples com retorno imediato

<?php

?>
<?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 uma tarefa e recuperando status incremental

Uma tarefa é enviada e o script faz um laço para recuperar informações de status. O trabalhador tem um atraso artificial que resulta em uma tarefa de longa execução e envia status e dados conforme o processamento ocorre. Cada chamada subsequente a GearmanClient::doNormal() 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

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
0
stanislav dot reshetnev at gmail dot com
10 years ago
doNormal don't work in version php_gearman 0.8.3:

PHP Fatal error: Call to undefined method GearmanClient::doNormal()

But it exist in version 1.1.2.
up
-2
fastest963 at gmail dot com
12 years ago
do() or doNormal() will block until the job is accepted by the worker. Looping is only necessary if you care about the response from the job. Use setTimeout() to control how long PHP will block.

If it does timeout, it throws a PHP Warning:
PHP Warning: GearmanClient::do(): _client_do(GEARMAN_TIMEOUT) occured during gearman_client_run_tasks() -> libgearman/client.cc:174
To Top