PHP Doku:: Run a single task and return a result - gearmanclient.do.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzSonstige DiensteGearmanThe GearmanClient classGearmanClient::do

Ein Service von Reinhard Neidl - Webprogrammierung.

The GearmanClient class

<<GearmanClient::data

GearmanClient::doBackground>>

GearmanClient::do

(PECL gearman >= 0.5.0)

GearmanClient::doRun a single task and return a result

Beschreibung

public string GearmanClient::do ( string $function_name , string $workload [, string $unique ] )

Runs a single task and returns a string representation of the result. It is up to the GearmanClient and GearmanWorker to agree on the format of the result.

Parameter-Liste

function_name

Die registrierte Funktion, die der Worker ausführen soll

workload

Serialisierte Daten, die verarbeitet werden sollen

unique

Eine eindeutige ID, die einen bestimmten Task identifiziert

Rückgabewerte

A string representing the results of running a task.

Beispiele

Beispiel #1 Simple job submission with immediate return

<?php

# Client code

echo "Starting\n";

# Create our client object.
$gmclient= new GearmanClient();

# Add default server (localhost).
$gmclient->addServer();

echo 
"Sending job\n";

$result $gmclient->do("reverse""Hello!");

echo 
"Success: $result\n";

?>
<?php

echo "Starting\n";

# Create our worker object.
$gmworker= new GearmanWorker();

# Add default server (localhost).
$gmworker->addServer();

# Register function "reverse" with the server. Change the worker function to
# "reverse_fn_fast" for a faster worker with no output.
$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)
{
  return 
strrev($job->workload());
}

?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

Starting
Sending job
Success: !olleH

Beispiel #2 Submitting a job and retrieving incremental status

A job is submitted and the script loops to retrieve status information. The worker has an artificial delay which results in a long running job and sends status and data as processing occurs. Each subsequent call to GearmanClient::do() produces status information on the running job.

<?php

# Client code

# Create our client object.
$gmclient= new GearmanClient();

# Add default server (localhost).
$gmclient->addServer();

echo 
"Sending job\n";

# Send reverse job
do
{
  
$result $gmclient->do("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:
      break;
    default:
      echo 
"RET: " $gmclient->returnCode() . "\n";
      echo 
"Error: " $gmclient->error() . "\n";
      echo 
"Errno: " $gmclient->getErrno() . "\n";
      exit;
  }
}
while(
$gmclient->returnCode() != GEARMAN_SUCCESS);

echo 
"Success: $result\n";

?>
<?php

# Worker code

echo "Starting\n";

# Create our worker object.
$gmworker= new GearmanWorker();

# Add default server (localhost).
$gmworker->addServer();

# Register function "reverse" with the server.
$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";

  
# This status loop is not needed, just showing how it works
  
for ($x0$x $workload_size$x++)
  {
    echo 
"Sending status: " $x "/$workload_size complete\n";
    
$job->sendStatus($x+1$workload_size);
    
$job->sendData(substr($workload$x1));
    
sleep(1);
  }

  
$resultstrrev($workload);
  echo 
"Result: $result\n";

  
# Return what we want to send back to the client.
  
return $result;
}

?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

Worker output:

Starting
Waiting for job...
Received job: H:foo.local:106
Workload: Hello! (6)
1/6 complete
2/6 complete
3/6 complete
4/6 complete
5/6 complete
6/6 complete
Result: !olleH

Client output:

Starting
Sending job
Status: 1/6 complete
Data: H
Status: 2/6 complete
Data: e
Status: 3/6 complete
Data: l
Status: 4/6 complete
Data: l
Status: 5/6 complete
Data: o
Status: 6/6 complete
Data: !
Success: !olleH

Siehe auch


Ein BenutzerBeitrag:
- Beiträge aktualisieren...
Shane Harter
15.06.2010 20:41
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.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)