<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/class.eventhttpconnection.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'eventhttpconnection.setclosecallback.php',
    1 => 'EventHttpConnection::setCloseCallback',
    2 => 'D&eacute;finit une fonction de rappel lors de la fermeture de la connexion',
  ),
  'up' => 
  array (
    0 => 'class.eventhttpconnection.php',
    1 => 'EventHttpConnection',
  ),
  'prev' => 
  array (
    0 => 'eventhttpconnection.makerequest.php',
    1 => 'EventHttpConnection::makeRequest',
  ),
  'next' => 
  array (
    0 => 'eventhttpconnection.setlocaladdress.php',
    1 => 'EventHttpConnection::setLocalAddress',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/event/eventhttpconnection/setclosecallback.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="eventhttpconnection.setclosecallback" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">EventHttpConnection::setCloseCallback</h1>
  <p class="verinfo">(PECL event &gt;= 1.8.0)</p><p class="refpurpose"><span class="refname">EventHttpConnection::setCloseCallback</span> &mdash; <span class="dc-title">Définit une fonction de rappel lors de la fermeture de la connexion</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-eventhttpconnection.setclosecallback-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span>
   <span class="modifier">function</span> <span class="methodname"><strong>EventHttpConnection::setCloseCallback</strong></span>(<span class="methodparam">
    
    <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$callback</code>
   </span>, <span class="methodparam">
    
    <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">$data</code>
   <span class="initializer"> = ?</span></span>): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

  <p class="para rdfs-comment">
   Définit une fonction de rappel lors de la fermeture de la connexion.
  </p>
 </div>

 <div class="refsect1 parameters" id="refsect1-eventhttpconnection.setclosecallback-parameters">
  <h3 class="title">Liste de paramètres</h3>
  <dl>
   
    <dt>
     <code class="parameter">callback</code>
    </dt>
    <dd>
     <p class="para">
      Fonction de rappel à appeler lors de la fermeture de la connexion.
      Devrait correspondre au prototype suivant :
     </p>
     <div class="methodsynopsis dc-description">
      <span class="modifier">function</span> <span class="methodname"><strong>callback</strong></span>(<span class="methodparam">
       
       <span class="type"><a href="class.eventhttpconnection.php" class="type EventHttpConnection">EventHttpConnection</a></span> <code class="parameter">$conn</code>
       <span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span>
      </span>, <span class="methodparam">
       
       <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">$arg</code>
       <span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span>
      </span>): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

    </dd>
   
  </dl>
 </div>

 <div class="refsect1 returnvalues" id="refsect1-eventhttpconnection.setclosecallback-returnvalues">
  <h3 class="title">Valeurs de retour</h3>
  <p class="para">
   Aucune valeur n&#039;est retournée.
  </p>
 </div>

 <div class="refsect1 examples" id="refsect1-eventhttpconnection.setclosecallback-examples">
  <h3 class="title">Exemples</h3>
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Exemple avec <span class="methodname"><strong>EventHttpConnection::setCloseCallback()</strong></span></strong></p>
   <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
 * Configuration de la fonction de rappel de fermeture de connexion
 *
 * Le script gère les connexions fermées en utilisant l'API HTTP.
 *
 * Utilisation :
 * 1) Lancez le serveur :
 * $ php examples/http_closecb.php 4242
 *
 * 2) Lancez un client dans un autre terminal. La session
 * de type Telnet devrait ressembler à ceci :
 *
 * $ nc -t 127.0.0.1 4242
 * GET / HTTP/1.0
 * Connection: close
 *
 * Le serveur devrait afficher quelque chose de similaire à :
 *
 * HTTP/1.0 200 OK
 * Content-Type: multipart/x-mixed-replace;boundary=boundarydonotcross
 * Connection: close
 *
 * &lt;html&gt;
 *
 * 3) Terminez la connexion client brusquement,
 * par exemple en tuant le processus, ou en appuyant sur Ctrl-C.
 *
 * 4) Vérifiez si le serveur a appelé _close_callback.
 * Le script devrait afficher la chaîne "_close_callback" sur la sortie standard.
 *
 * 5) Vérifiez que le processus serveur n'a pas de connexions orphelines,
 * par exemple avec l'utilitaire `lsof`.
 */

</span><span style="color: #007700">function </span><span style="color: #0000BB">_close_callback</span><span style="color: #007700">(</span><span style="color: #0000BB">$conn</span><span style="color: #007700">)
{
    echo </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
}

function </span><span style="color: #0000BB">_http_default</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">$dummy</span><span style="color: #007700">)
{
    </span><span style="color: #0000BB">$conn </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getConnection</span><span style="color: #007700">();
    </span><span style="color: #0000BB">$conn</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setCloseCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">'_close_callback'</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">);

    </span><span style="color: #FF8000">/*
    En activant Event::READ, on protège le serveur contre les connexions non fermées.
    C'est une particularité de Libevent. La bibliothèque désactive les événements
    Event::READ sur cette connexion, et le serveur n'est pas notifié des connexions
    terminées.

    Ainsi, chaque fois qu'un client termine brusquement la connexion, on obtient une
    connexion orpheline. Par exemple, voici une partie de la commande
    `lsof -p $PID | grep TCP` après que le client a terminé la connexion :

    57-php     15057 ruslan  6u  unix 0xffff8802fb59c780   0t0  125187 socket
    58:php     15057 ruslan  7u  IPv4             125189   0t0     TCP *:4242 (LISTEN)
    59:php     15057 ruslan  8u  IPv4             124342   0t0     TCP localhost:4242-&gt;localhost:37375 (CLOSE_WAIT)

    où $PID est l'identifiant du processus.

    Le bloc de code suivant corrige ce type de connexions orphelines.
     */
    </span><span style="color: #0000BB">$bev </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getBufferEvent</span><span style="color: #007700">();
    </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">enable</span><span style="color: #007700">(</span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">READ</span><span style="color: #007700">);

    </span><span style="color: #FF8000">// Nous devons le libérer explicitement. Voir EventHttpRequest::getConnection

    </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">free</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Nous devons le libérer explicitement


    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">addHeader</span><span style="color: #007700">(
        </span><span style="color: #DD0000">'Content-Type'</span><span style="color: #007700">,
        </span><span style="color: #DD0000">'multipart/x-mixed-replace;boundary=boundarydonotcross'</span><span style="color: #007700">,
        </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">OUTPUT_HEADER
    </span><span style="color: #007700">);

    </span><span style="color: #0000BB">$buf </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBuffer</span><span style="color: #007700">();
    </span><span style="color: #0000BB">$buf</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">add</span><span style="color: #007700">(</span><span style="color: #DD0000">'&lt;html&gt;'</span><span style="color: #007700">);

    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendReply</span><span style="color: #007700">(</span><span style="color: #0000BB">200</span><span style="color: #007700">, </span><span style="color: #DD0000">"OK"</span><span style="color: #007700">);
    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendReplyChunk</span><span style="color: #007700">(</span><span style="color: #0000BB">$buf</span><span style="color: #007700">);
}

</span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">4242</span><span style="color: #007700">;
if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">) {
    </span><span style="color: #0000BB">$port </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];
}
if (</span><span style="color: #0000BB">$port </span><span style="color: #007700">&lt;= </span><span style="color: #0000BB">0 </span><span style="color: #007700">|| </span><span style="color: #0000BB">$port </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">65535</span><span style="color: #007700">) {
    exit(</span><span style="color: #DD0000">"Port invalide"</span><span style="color: #007700">);
}

</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
</span><span style="color: #0000BB">$http </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventHttp</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">);

</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setDefaultCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">"_http_default"</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">);
</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bind</span><span style="color: #007700">(</span><span style="color: #DD0000">"0.0.0.0"</span><span style="color: #007700">, </span><span style="color: #0000BB">$port</span><span style="color: #007700">);
</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">loop</span><span style="color: #007700">();

</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

  </div>
 </div>

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