<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.yar.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'yar.examples.php',
    1 => 'Ejemplos',
    2 => 'Ejemplos',
  ),
  'up' => 
  array (
    0 => 'book.yar.php',
    1 => 'Yar',
  ),
  'prev' => 
  array (
    0 => 'yar.constants.php',
    1 => 'Constantes predefinidas',
  ),
  'next' => 
  array (
    0 => 'class.yar-server.php',
    1 => 'Yar_Server',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/yar/examples.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="yar.examples" class="chapter">
 <h1 class="title">Ejemplos</h1>

 <p class="simpara">
  Los ejemplos siguientes recorren un servicio completo: un servidor que
  expone algunos métodos aritméticos, un cliente síncrono que los llama,
  un cliente que lanza varias llamadas de forma concurrente y un cliente
  que se comunica con un servidor por TCP.
 </p>

 <div class="example" id="example-1">
  <p><strong>Ejemplo #1 Ejemplo de servidor Yar</strong></p>
  <div class="example-contents"><p>
   Un servicio Yar no es más que una clase PHP normal envuelta por
   <span class="classname"><a href="class.yar-server.php" class="classname">Yar_Server</a></span>. Cada método público del objeto se
   convierte en un punto de acceso RPC; los métodos protegidos y privados,
   así como los métodos cuyo nombre empieza por un guion bajo, permanecen
   ocultos para los clientes. Los comentarios de documentación de los
   métodos públicos se recopilan y se muestran en la página de información
   del servicio.
  </p></div>
  <div class="example-contents"><p>
   Las peticiones RPC llegan como peticiones HTTP POST que transportan una
   carga útil binaria del protocolo Yar, por lo que el script suele
   asociarse a un URI de un servidor web normal.
  </p></div>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #FF8000">/* se supone que esta página es accesible en http://api.example.com/operator.php */

</span><span style="color: #007700">class </span><span style="color: #0000BB">Operator </span><span style="color: #007700">{

    </span><span style="color: #FF8000">/**
     * Suma dos operandos
     * @param integer
     * @return integer
     */
    </span><span style="color: #007700">public function </span><span style="color: #0000BB">add</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {
        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">_add</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">);
    }

    </span><span style="color: #FF8000">/**
     * Resta
     */
    </span><span style="color: #007700">public function </span><span style="color: #0000BB">sub</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {
        return </span><span style="color: #0000BB">$a </span><span style="color: #007700">- </span><span style="color: #0000BB">$b</span><span style="color: #007700">;
    }

    </span><span style="color: #FF8000">/**
     * Multiplicación
     */
    </span><span style="color: #007700">public function </span><span style="color: #0000BB">mul</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {
        return </span><span style="color: #0000BB">$a </span><span style="color: #007700">* </span><span style="color: #0000BB">$b</span><span style="color: #007700">;
    }

    </span><span style="color: #FF8000">/**
     * Los métodos protegidos no se exponen
     * @param integer
     * @return integer
     */
    </span><span style="color: #007700">protected function </span><span style="color: #0000BB">_add</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {
        return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;
    }
}

</span><span style="color: #0000BB">$server </span><span style="color: #007700">= new </span><span style="color: #0000BB">Yar_Server</span><span style="color: #007700">(new </span><span style="color: #0000BB">Operator</span><span style="color: #007700">());
</span><span style="color: #0000BB">$server</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">handle</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>

 <div class="example" id="example-2">
  <p><strong>Ejemplo #2 Acceso al servidor desde el navegador (petición GET)</strong></p>
  <div class="example-contents"><p>
   Cuando se emite una petición GET al URI del servicio, por ejemplo al
   abrirlo en un navegador, Yar no realiza una llamada RPC, sino que
   muestra una página de información que lista todos los métodos públicos
   del objeto ejecutor junto con su comentario de documentación. Esto se
   controla con la directiva
   <a href="yar.configuration.php#ini.yar.expose-info" class="link">yar.expose_info</a>; cuando está
   desactivada, la petición GET falla en su lugar.
  </p></div>
  <div class="example-contents"><p>Resultado del ejemplo anterior
es similar a:</p></div>
  <div class="mediaobject">
   
   <div class="imageobject">
    <img src="images/4fd86c7f1b197d1d954ad0f4b033dc93-yar.png" alt="Yar Server Info" width="700px"  />
   </div>
  </div>
 </div>

 <div class="example" id="example-3">
  <p><strong>Ejemplo #3 Ejemplo de cliente Yar</strong></p>
  <div class="example-contents"><p>
   Un <span class="classname"><a href="class.yar-client.php" class="classname">Yar_Client</a></span> está asociado a una única dirección
   de servicio. Llamar a cualquier método no definido sobre él se convierte
   de forma transparente en una llamada RPC síncrona, de modo que los
   métodos remotos se ven y se usan como si fueran locales;
   <span class="methodname"><a href="yar-client.call.php" class="methodname">Yar_Client::call()</a></span> hace lo mismo indicando el
   nombre de forma explícita.
  </p></div>
  <div class="example-contents"><p>
   Los métodos protegidos no se exponen: llamar a uno de ellos falla con
   una <span class="exceptionname"><a href="class.yar-client-exception.php" class="exceptionname">Yar_Client_Exception</a></span> cuyo código es
   <strong><code><a href="yar.constants.php#constant.yar-err-request">YAR_ERR_REQUEST</a></code></strong>.
  </p></div>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$client </span><span style="color: #007700">= new </span><span style="color: #0000BB">Yar_Client</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://api.example.com/operator.php"</span><span style="color: #007700">);

</span><span style="color: #FF8000">/* llamada directa */
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$client</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">add</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">));

</span><span style="color: #FF8000">/* llamada mediante call() */
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$client</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">call</span><span style="color: #007700">(</span><span style="color: #DD0000">"add"</span><span style="color: #007700">, array(</span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">)));

</span><span style="color: #FF8000">/* _add no se puede llamar: no es público */
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$client</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">_add</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">));
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

  <div class="example-contents"><p>Resultado del ejemplo anterior
es similar a:</p></div>
  <div class="example-contents screen">
<div class="cdata"><pre>
int(3)
int(5)
PHP Fatal error:  Uncaught Yar_Client_Exception: call to undefined api Operator::_add() in *
</pre></div>
  </div>
 </div>

 <div class="example" id="example-4">
  <p><strong>Ejemplo #4 Ejemplo de cliente concurrente Yar</strong></p>
  <div class="example-contents"><p>
   En lugar de llamar a los servicios uno tras otro,
   <span class="classname"><a href="class.yar-concurrent-client.php" class="classname">Yar_Concurrent_Client</a></span> registra primero varias
   llamadas y luego las envía todas a la vez con
   <span class="methodname"><a href="yar-concurrent-client.loop.php" class="methodname">Yar_Concurrent_Client::loop()</a></span>. Las respuestas se
   pasan al callback en el orden en que llegan, no en el orden en que se
   registraron las llamadas.
  </p></div>
  <div class="example-contents"><p>
   Justo después de que se hayan enviado todas las peticiones, el callback
   se invoca una vez con argumentos <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> para que quien lo llama sepa que
   no queda ninguna petición pendiente; el ejemplo siguiente comprueba esta
   notificación.
  </p></div>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">function </span><span style="color: #0000BB">callback</span><span style="color: #007700">(</span><span style="color: #0000BB">$ret</span><span style="color: #007700">, </span><span style="color: #0000BB">$callinfo</span><span style="color: #007700">) {
    if (</span><span style="color: #0000BB">$callinfo </span><span style="color: #007700">== </span><span style="color: #0000BB">NULL</span><span style="color: #007700">) {
        </span><span style="color: #FF8000">/* todas las peticiones se han enviado, esperando las respuestas */
        </span><span style="color: #007700">return;
    }
    echo </span><span style="color: #0000BB">$callinfo</span><span style="color: #007700">[</span><span style="color: #DD0000">'method'</span><span style="color: #007700">], </span><span style="color: #DD0000">" resultado: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$ret</span><span style="color: #007700">, </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;
}

function </span><span style="color: #0000BB">error_callback</span><span style="color: #007700">(</span><span style="color: #0000BB">$type</span><span style="color: #007700">, </span><span style="color: #0000BB">$error</span><span style="color: #007700">, </span><span style="color: #0000BB">$callinfo</span><span style="color: #007700">) {
    </span><span style="color: #0000BB">error_log</span><span style="color: #007700">(</span><span style="color: #DD0000">"[</span><span style="color: #0000BB">$type</span><span style="color: #DD0000">] </span><span style="color: #0000BB">$error</span><span style="color: #DD0000">"</span><span style="color: #007700">);
}

</span><span style="color: #FF8000">/* registra llamadas asíncronas a servicios remotos */
</span><span style="color: #0000BB">Yar_Concurrent_Client</span><span style="color: #007700">::</span><span style="color: #0000BB">call</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://api.example.com/operator.php"</span><span style="color: #007700">, </span><span style="color: #DD0000">"add"</span><span style="color: #007700">, array(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">), </span><span style="color: #DD0000">"callback"</span><span style="color: #007700">);
</span><span style="color: #0000BB">Yar_Concurrent_Client</span><span style="color: #007700">::</span><span style="color: #0000BB">call</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://api.example.com/operator.php"</span><span style="color: #007700">, </span><span style="color: #DD0000">"sub"</span><span style="color: #007700">, array(</span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">), </span><span style="color: #DD0000">"callback"</span><span style="color: #007700">);
</span><span style="color: #0000BB">Yar_Concurrent_Client</span><span style="color: #007700">::</span><span style="color: #0000BB">call</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://api.example.com/operator.php"</span><span style="color: #007700">, </span><span style="color: #DD0000">"mul"</span><span style="color: #007700">, array(</span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">), </span><span style="color: #DD0000">"callback"</span><span style="color: #007700">);

</span><span style="color: #FF8000">/* envía todas las peticiones y espera las respuestas */
</span><span style="color: #0000BB">Yar_Concurrent_Client</span><span style="color: #007700">::</span><span style="color: #0000BB">loop</span><span style="color: #007700">(</span><span style="color: #DD0000">"callback"</span><span style="color: #007700">, </span><span style="color: #DD0000">"error_callback"</span><span style="color: #007700">);
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

  <div class="example-contents"><p>Resultado del ejemplo anterior
es similar a:</p></div>
  <div class="example-contents screen">
<div class="cdata"><pre>
mul resultado: 4
sub resultado: 1
add resultado: 3
</pre></div>
  </div>
 </div>

 <div class="example" id="example-5">
  <p><strong>Ejemplo #5 Ejemplo de cliente TCP Yar</strong></p>
  <div class="example-contents"><p>
   Además de HTTP, <span class="classname"><a href="class.yar-client.php" class="classname">Yar_Client</a></span> puede comunicarse con
   servidores compatibles con Yar a través de TCP o de sockets Unix, por
   ejemplo con un servicio implementado con el
   <a href="https://github.com/laruence/yar-c" class="link external">&raquo;&nbsp;framework Yar en C</a>,
   que sirve el mismo protocolo binario de Yar que usa el servidor PHP.
  </p></div>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$client </span><span style="color: #007700">= new </span><span style="color: #0000BB">Yar_Client</span><span style="color: #007700">(</span><span style="color: #DD0000">"tcp://127.0.0.1:8600"</span><span style="color: #007700">);

</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$client</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">add</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">));
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>

</div>
<?php manual_footer($setup); ?>