mirror of
https://github.com/php/doc-es.git
synced 2026-03-23 23:12:09 +01:00
476 lines
11 KiB
XML
476 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: cf0a919c126e45b5df583d188e77fa62015b714a Maintainer: tatai Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="gearman.examples">
|
|
&reftitle.examples;
|
|
<section xml:id="gearman.examples-reverse">
|
|
<title>Uso básico</title>
|
|
<example>
|
|
<title>Cliente y trabajador básicos en Gearman</title>
|
|
<simpara>
|
|
Este ejemplo muestra un cliente y un trabajador muy sencillo. El cliente
|
|
envía un string al servidor de trabajos, y el trabajador da la vuelta al
|
|
string y lo envía de vuelta. El trabajo se realiza de forma síncrona.
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
# Se crea el objeto cliente
|
|
$gmclient= new GearmanClient();
|
|
|
|
# Se añade el servidor por defecto (localhost).
|
|
$gmclient->addServer();
|
|
|
|
echo "Sending job\n";
|
|
|
|
# Enviamos trabajo "reverse"
|
|
do
|
|
{
|
|
$result = $gmclient->do("reverse", "Hello!");
|
|
|
|
# Comprobación de varios paquetes de retorno y errores
|
|
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";
|
|
exit;
|
|
}
|
|
}
|
|
while($gmclient->returnCode() != GEARMAN_SUCCESS);
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
echo "Starting\n";
|
|
|
|
# Se crea el objeto del trabajador
|
|
$gmworker= new GearmanWorker();
|
|
|
|
# Se añade el servidor por defecto (localhost).
|
|
$gmworker->addServer();
|
|
|
|
# Registro de la función "reverse" en el servidor. Cambiar la función del
|
|
# trabajador a "reverse_fn_fast" para un trabajo más rápido sin mensajes de
|
|
# estado.
|
|
$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";
|
|
|
|
# Este bucle de estado no es necesario, sólo es para mostrar cómo funciona
|
|
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";
|
|
|
|
# Retornamos lo que hay que enviar de vuelta al cliente
|
|
return $result;
|
|
}
|
|
|
|
# Una forma mucho más sencilla y que da menos información sería:
|
|
function reverse_fn_fast($job)
|
|
{
|
|
return strrev($job->workload());
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs.similar;
|
|
<screen>
|
|
<![CDATA[
|
|
% 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
|
|
]]>
|
|
</screen>
|
|
<screen>
|
|
<![CDATA[
|
|
% 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
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</section>
|
|
<section xml:id="gearman.examples-reverse-bg">
|
|
<title>Cliente y trabajador básicos en Gearman, trabajo en segundo plano</title>
|
|
<example>
|
|
<title>Cliente y trabajador básicos en Gearman, trabajo en segundo plano</title>
|
|
<simpara>
|
|
Este ejemplo muestra un trabajador y un cliente muy sencillos. El cliente
|
|
envía un string al servidor de trabajos como trabajo en segundo plano, y
|
|
el trabajador da la vuelta al string. Notar que como el trabajo se
|
|
realiza de forma asíncrona, el cliente no espera a que se complete el
|
|
trabajo y termina (y, por tanto, el cliente nunca recibe los resultados).
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
# Creación del objeto cliente
|
|
$gmclient= new GearmanClient();
|
|
|
|
# Se añade el servidor por defecto (localhost)
|
|
$gmclient->addServer();
|
|
|
|
# Ejecutar el cliente "reverse" en segundo plano
|
|
$job_handle = $gmclient->doBackground("reverse", "this is a test");
|
|
|
|
if ($gmclient->returnCode() != GEARMAN_SUCCESS)
|
|
{
|
|
echo "bad return code\n";
|
|
exit;
|
|
}
|
|
|
|
echo "done!\n";
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
echo "Starting\n";
|
|
|
|
# Creación del objeto trabajador
|
|
$gmworker= new GearmanWorker();
|
|
|
|
# Se añade el servidor por defecto (localhost).
|
|
$gmworker->addServer();
|
|
|
|
# Registro de la función "reverse" en el servidor. Cambiar la funcion del
|
|
# trabajador a "reverse_fn_fast" para usar un trabajador más rápido sin
|
|
# mostrar mensajes de estado
|
|
$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";
|
|
|
|
# Este bucle de estado no es necesario, únicamente muestra cómo funciona
|
|
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";
|
|
|
|
# Retorna lo que se quiere enviar de vuelta al cliente
|
|
return $result;
|
|
}
|
|
|
|
# Una versión mucho más sencilla y que muestra menos información del proceso sería:
|
|
function reverse_fn_fast($job)
|
|
{
|
|
return strrev($job->workload());
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs.similar;
|
|
<screen>
|
|
<![CDATA[
|
|
% php reverse_worker.php
|
|
Starting
|
|
Waiting for job...
|
|
Received job: H:foo.local:41
|
|
Workload: this is a test (14)
|
|
1/14 complete
|
|
2/14 complete
|
|
3/14 complete
|
|
4/14 complete
|
|
5/14 complete
|
|
6/14 complete
|
|
7/14 complete
|
|
8/14 complete
|
|
9/14 complete
|
|
10/14 complete
|
|
11/14 complete
|
|
12/14 complete
|
|
13/14 complete
|
|
14/14 complete
|
|
Result: tset a si siht
|
|
]]>
|
|
</screen>
|
|
<screen>
|
|
<![CDATA[
|
|
% php reverse_client_bg.php
|
|
done!
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</section>
|
|
<section xml:id="gearman.examples-reverse-task">
|
|
<title>Cliente y trabajador básicos, enviando tareas</title>
|
|
<example>
|
|
<title>Cliente y trabajador básicos, enviando tareas</title>
|
|
<simpara>
|
|
En este ejemplo, se extiende el cliente básico que da la vuelta al texto
|
|
para ejecutar dos tareas en paralelo. El trabajador "reverse" es idéntico
|
|
excepto la parte del envío del datos durante el proceso.
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
# Creación del cliente Gearman
|
|
$gmc= new GearmanClient();
|
|
|
|
# Añade el servidor por defecto (localhost)
|
|
$gmc->addServer();
|
|
|
|
# Registra alguna llamadas de retorno
|
|
$gmc->setCreatedCallback("reverse_created");
|
|
$gmc->setDataCallback("reverse_data");
|
|
$gmc->setStatusCallback("reverse_status");
|
|
$gmc->setCompleteCallback("reverse_complete");
|
|
$gmc->setFailCallback("reverse_fail");
|
|
|
|
# Asignación de datos arbitrarios para la aplicación
|
|
$data['foo'] = 'bar';
|
|
|
|
# Añade dos tareas
|
|
$task= $gmc->addTask("reverse", "foo", $data);
|
|
$task2= $gmc->addTaskLow("reverse", "bar", NULL);
|
|
|
|
# Ejecuta las tareas en paralelo (se asumen múltiples trabajadores)
|
|
if (! $gmc->runTasks())
|
|
{
|
|
echo "ERROR " . $gmc->error() . "\n";
|
|
exit;
|
|
}
|
|
|
|
echo "DONE\n";
|
|
|
|
function reverse_created($task)
|
|
{
|
|
echo "CREATED: " . $task->jobHandle() . "\n";
|
|
}
|
|
|
|
function reverse_status($task)
|
|
{
|
|
echo "STATUS: " . $task->jobHandle() . " - " . $task->taskNumerator() .
|
|
"/" . $task->taskDenominator() . "\n";
|
|
}
|
|
|
|
function reverse_complete($task)
|
|
{
|
|
echo "COMPLETE: " . $task->jobHandle() . ", " . $task->data() . "\n";
|
|
}
|
|
|
|
function reverse_fail($task)
|
|
{
|
|
echo "FAILED: " . $task->jobHandle() . "\n";
|
|
}
|
|
|
|
function reverse_data($task)
|
|
{
|
|
echo "DATA: " . $task->data() . "\n";
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
echo "Starting\n";
|
|
|
|
# Creación del objeto trabajador
|
|
$gmworker= new GearmanWorker();
|
|
|
|
# Añade el servidor por defecto (localhost).
|
|
$gmworker->addServer();
|
|
|
|
# Registra la función "reverse" en el servidor. Cambiar la función a
|
|
# "reverse_fn_fast" para obtener un worker más rápido que no genera
|
|
# informacion del proceso
|
|
$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";
|
|
|
|
# Este bucle de estado no es necesario, sólo es para mostrar cómo funciona
|
|
for ($x= 0; $x < $workload_size; $x++)
|
|
{
|
|
echo "Sending status: " . ($x + 1) . "/$workload_size complete\n";
|
|
$job->sendStatus($x+1, $workload_size);
|
|
$job->sendData(substr($workload, $x, 1));
|
|
sleep(1);
|
|
}
|
|
|
|
$result= strrev($workload);
|
|
echo "Result: $result\n";
|
|
|
|
# Retornamos lo que queremos enviar de vuelta al cliente
|
|
return $result;
|
|
}
|
|
|
|
# Una versión mucho más sencilla y que muestra menos información del proceso sería:
|
|
function reverse_fn_fast($job)
|
|
{
|
|
return strrev($job->workload());
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs.similar;
|
|
<screen>
|
|
<![CDATA[
|
|
% php reverse_worker.php
|
|
Starting
|
|
Waiting for job...
|
|
Received job: H:foo.local:45
|
|
Workload: foo (3)
|
|
1/3 complete
|
|
2/3 complete
|
|
3/3 complete
|
|
Result: oof
|
|
Received job: H:foo.local:44
|
|
Workload: bar (3)
|
|
1/3 complete
|
|
2/3 complete
|
|
3/3 complete
|
|
Result: rab
|
|
]]>
|
|
</screen>
|
|
<screen>
|
|
<![CDATA[
|
|
% php reverse_client_task.php
|
|
CREATED: H:foo.local:44
|
|
CREATED: H:foo.local:45
|
|
STATUS: H:foo.local:45 - 1/3
|
|
DATA: f
|
|
STATUS: H:foo.local:45 - 2/3
|
|
DATA: o
|
|
STATUS: H:foo.local:45 - 3/3
|
|
DATA: o
|
|
COMPLETE: H:foo.local:45, oof
|
|
STATUS: H:foo.local:44 - 1/3
|
|
DATA: b
|
|
STATUS: H:foo.local:44 - 2/3
|
|
DATA: a
|
|
STATUS: H:foo.local:44 - 3/3
|
|
DATA: r
|
|
COMPLETE: H:foo.local:44, rab
|
|
DONE
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</section>
|
|
</chapter>
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|