<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'yar.examples.php',
    1 => 'Exemples',
    2 => 'Exemples',
  ),
  'up' => 
  array (
    0 => 'book.yar.php',
    1 => 'Yar',
  ),
  'prev' => 
  array (
    0 => 'yar.constants.php',
    1 => 'Constantes pr&eacute;-d&eacute;finies',
  ),
  'next' => 
  array (
    0 => 'class.yar-server.php',
    1 => 'Yar_Server',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Exemples</h1>

 <p class="simpara">
  Les exemples ci-dessous décrivent un service complet : un serveur qui
  expose quelques méthodes arithmétiques, un client synchrone qui les
  appelle, un client qui parallélise plusieurs appels, et un client qui
  dialogue avec un serveur via TCP.
 </p>

 <div class="example" id="example-1">
  <p><strong>Exemple #1 Exemple de serveur Yar</strong></p>
  <div class="example-contents"><p>
   Un service Yar est simplement une classe PHP ordinaire enveloppée par
   <span class="classname"><a href="class.yar-server.php" class="classname">Yar_Server</a></span>. Chaque méthode publique de l&#039;objet
   devient un point d&#039;entrée RPC ; les méthodes protégées et privées, ainsi
   que celles dont le nom commence par un tiret bas, restent cachées aux
   clients. Les commentaires de documentation des méthodes publiques sont
   collectés et affichés sur la page d&#039;information du service.
  </p></div>
  <div class="example-contents"><p>
   Les requêtes RPC arrivent comme des requêtes HTTP POST portant un payload
   binaire au format du protocole Yar, donc le script est habituellement
   mappé à un URI sur un serveur web classique.
  </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">/* supposons que cette page soit accessible via 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">/**
     * Additionne deux opérandes
     * @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">/**
     * Sub
     */
    </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">/**
     * Mul
     */
    </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">/**
     * Les méthodes protégées ne seront pas exposées
     * @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>Exemple #2 Accès au serveur depuis un navigateur (requête GET)</strong></p>
  <div class="example-contents"><p>
   Lorsqu&#039;une requête GET est envoyée à l&#039;URI du service — par exemple en
   l&#039;ouvrant dans un navigateur — Yar n&#039;effectue pas d&#039;appel RPC mais
   affiche une page d&#039;information listant chaque méthode publique de l&#039;objet
   exécuteur accompagnée de son commentaire de documentation. Ceci est
   contrôlé par la directive
   <a href="yar.configuration.php#ini.yar.expose-info" class="link">yar.expose_info</a> ; quand elle
   est désactivée, une requête GET échoue à la place.
  </p></div>
  <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
  <div class="mediaobject">
   
   <div class="imageobject">
    <img src="images/4fd86c7f1b197d1d954ad0f4b033dc93-yar.png" alt="Information du serveur Yar" width="700px"  />
   </div>
  </div>
 </div>

 <div class="example" id="example-3">
  <p><strong>Exemple #3 Exemple de client 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 lié à une seule adresse de
   service. Appeler n&#039;importe quelle méthode non définie dessus est
   transparentement transformé en appel RPC synchrone, les méthodes distantes
   se comportant donc comme des méthodes locales ;
   <span class="methodname"><a href="yar-client.call.php" class="methodname">Yar_Client::call()</a></span> fait la même chose explicitement
   par nom.
  </p></div>
  <div class="example-contents"><p>
   Les méthodes protégées ne sont pas exposées : les appeler échoue avec une
   <span class="exceptionname"><a href="class.yar-client-exception.php" class="exceptionname">Yar_Client_Exception</a></span> dont le code est
   <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">/* appel direct */
</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">/* appel via 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 ne peut pas être appelée : elle n'est pas publique */
</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>Résultat de l&#039;exemple ci-dessus est similaire à :</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>Exemple #4 Exemple de client Yar concurrent</strong></p>
  <div class="example-contents"><p>
   Au lieu d&#039;appeler les services l&#039;un après l&#039;autre,
   <span class="classname"><a href="class.yar-concurrent-client.php" class="classname">Yar_Concurrent_Client</a></span> enregistre d&#039;abord plusieurs
   appels, puis les dispatch tous en même temps avec
   <span class="methodname"><a href="yar-concurrent-client.loop.php" class="methodname">Yar_Concurrent_Client::loop()</a></span>. Les réponses sont
   passées au callback dans l&#039;ordre où elles arrivent, pas dans l&#039;ordre où
   les appels ont été enregistrés.
  </p></div>
  <div class="example-contents"><p>
   Juste après que toutes les requêtes ont été envoyées, le callback est
   invoqué une fois avec des arguments <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> pour signaler à l&#039;appelant
   qu&#039;aucune requête n&#039;est plus en attente ; l&#039;exemple ci-dessous vérifie
   cette notification.
  </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">/* toutes les requêtes ont été envoyées, en attente des réponses */
        </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">" résultat : "</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">/* enregistre les appels asynchrones vers les services distants */
</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">/* envoie toutes les requêtes et attend les réponses */
</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>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
  <div class="example-contents screen">
<div class="cdata"><pre>
mul résultat : 4
sub résultat : 1
add résultat : 3
</pre></div>
  </div>
 </div>

 <div class="example" id="example-5">
  <p><strong>Exemple #5 Exemple de client Yar TCP</strong></p>
  <div class="example-contents"><p>
   Outre HTTP, <span class="classname"><a href="class.yar-client.php" class="classname">Yar_Client</a></span> peut dialoguer avec des
   serveurs compatibles Yar via TCP ou des sockets Unix, par exemple un
   service implémenté avec le
   <a href="https://github.com/laruence/yar-c" class="link external">&raquo;&nbsp;framework Yar en C</a>,
   qui utilise le même protocole binaire Yar que le serveur 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); ?>