Zend_TimeSync-Working.xml 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <!-- EN-Revision: 13828 -->
  2. <sect1 id="zend.timesync.working">
  3. <title>Utiliser Zend_TimeSync</title>
  4. <para><classname>Zend_TimeSync</classname> peut retourner le temps de n'importe quel serveur via <emphasis
  5. role="strong">NTP</emphasis> ou <emphasis role="strong">SNTP</emphasis>. Il peut aussi gérer de multiples
  6. serveurs.</para>
  7. <note>
  8. <para>Dans tous les exemples qui suivront, nous utiliserons un pool de serveurs générique public : <emphasis
  9. role="strong">0.europe.pool.ntp.org</emphasis>. De votre côté, il est conseillé d'utiliser le pool le plus
  10. proche possible géographiquement de votre position. Lisez <ulink
  11. url="http://www.pool.ntp.org">http://www.pool.ntp.org</ulink> pour plus d'informations.</para>
  12. </note>
  13. <sect2 id="zend.timesync.working.generic">
  14. <title>Requêter un serveur de temps public</title>
  15. <para>Cette opération est très simple, il suffit de préciser le serveur de temps à utiliser.</para>
  16. <programlisting role="php"><![CDATA[
  17. $server = new Zend_TimeSync('0.pool.ntp.org');
  18. print $server->getDate()->getIso();
  19. ]]></programlisting>
  20. <para>Que se passe-t-il en arrière plan de <classname>Zend_TimeSync</classname> ? Tout d'abord la syntaxe est vérifiée.
  21. Ainsi, "<code>0.pool.ntp.org</code>" est vérifié et reconnu comme pouvant être un serveur de temps. Ensuite
  22. l'appel à <code>getDate()</code> génère une requête vers le serveur de temps qui retourne son temps.
  23. <classname>Zend_TimeSync</classname> va alors calculer la différence entre ce temps retourné, et le temps actuel du
  24. serveur sur lequel le script tourne, et retourner finalement un objet <classname>Zend_Date</classname> représentant le
  25. temps actuel, juste et corrigé.</para>
  26. <para>Pour plus de détails sur les objets <classname>Zend_Date</classname> et leurs méthodes, voyez la documentation de
  27. <link linkend="zend.date.introduction">Zend_Date</link>.</para>
  28. </sect2>
  29. <sect2 id="zend.timesync.working.multiple">
  30. <title>Serveurs de temps multiples</title>
  31. <para>Tous les serveurs de temps ne sont pas disponibles tout le temps, à 100%. Il peuvent subir des opérations
  32. de maintenance, ou tout simplement se retrouver saturés. Dans de tels cas, une exception sera levée.</para>
  33. <para><classname>Zend_TimeSync</classname> peut gérer plusieurs serveurs, et se connecter automatiquement au suivant, si
  34. le précédent ne répond pas. Passez un tableau de serverus de temps au constructeur de l'objet, ou utilisez la
  35. méthode <code>addServer()</code> :</para>
  36. <programlisting role="php"><![CDATA[
  37. $server = new Zend_TimeSync(array('0.pool.ntp.org',
  38. '1.pool.ntp.org',
  39. '2.pool.ntp.org'));
  40. $server->addServer('3.pool.ntp.org');
  41. print $server->getDate()->getIso();
  42. ]]></programlisting>
  43. <para>Vous pouvez ajouter une infinité de serveurs, et <classname>Zend_TimeSync</classname> basculera automatiquement au
  44. suivant, si un ne répond pas.</para>
  45. <para>Vous devriez aussi nommer vos serveurs de temps. Ceci se fait au moyen de la clé du tableau de serveurs,
  46. ou en second paramètre de la méthode addServer() :</para>
  47. <programlisting role="php"><![CDATA[
  48. $server = new Zend_TimeSync(array('generic' => '0.pool.ntp.org',
  49. 'fallback' => '1.pool.ntp.org',
  50. 'reserve' => '2.pool.ntp.org'));
  51. $server->addServer('3.pool.ntp.org', 'additional');
  52. print $server->getDate()->getIso();
  53. ]]></programlisting>
  54. <para>En nommant vos serveurs, vous pourrez en interroger un en particulier comme nous allons le voir.</para>
  55. </sect2>
  56. <sect2 id="zend.timesync.working.protocol">
  57. <title>Les protocoles des serveurs de temps</title>
  58. <para>La plupart des serveurs publics de temps utilisent le protocole <emphasis role="strong">NTP</emphasis>.
  59. Mais d'autres protocoles existent.</para>
  60. <para>Vous pouvez spécifier le protocole dans l'adresse du serveur de temps. <classname>Zend_TimeSync</classname> en
  61. supporte deux actuellement. Celui par défaut est <emphasis role="strong">NTP</emphasis>. Si vous omettez le
  62. protocole dans l'adresse, c'est NTP qui sera utilisé.</para>
  63. <programlisting role="php"><![CDATA[
  64. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
  65. 'fallback' => 'ntp:\\1.pool.ntp.org',
  66. 'reserve' => 'ntp:\\2.pool.ntp.org'));
  67. $server->addServer('sntp:\\internal.myserver.com', 'additional');
  68. print $server->getDate()->getIso();
  69. ]]></programlisting>
  70. <para><classname>Zend_TimeSync</classname> peut donc gérer plusieurs serveurs, et plusieurs protocoles, en même
  71. temps.</para>
  72. </sect2>
  73. <sect2 id="zend.timesync.working.ports">
  74. <title>Utiliser les ports pour les serveurs de temps</title>
  75. <para>Comme tous les protocoles, <emphasis role="strong">NTP</emphasis> et <emphasis
  76. role="strong">SNTP</emphasis> utilisent des ports par défaut.</para>
  77. <para>Quelque fois il peut être nécessaire de préciser le port à utiliser. Si c'est le cas, rajoutez le
  78. simplement à l'adresse du serveur à utiliser, sinon <classname>Zend_TimeSync</classname> utilisera celui par
  79. défaut.</para>
  80. <programlisting role="php"><![CDATA[
  81. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org:200',
  82. 'fallback' => 'ntp:\\1.pool.ntp.org'));
  83. $server->addServer('sntp:\\internal.myserver.com:399', 'additional');
  84. print $server->getDate()->getIso();
  85. ]]></programlisting>
  86. </sect2>
  87. <sect2 id="zend.timesync.working.options">
  88. <title>Options pour les serveurs de temps</title>
  89. <para>Actuellement seule une option est utilisée en interne par <classname>Zend_TimeSync</classname>. Mais vous pouvez en
  90. utiliser autant que vous voulez.</para>
  91. <para>L'option <emphasis role="strong">timeout</emphasis> définit le nombre de secondes au delà duquel la
  92. connexion sera considérée comme cassée. La valeur par défaut est <emphasis role="strong">1</emphasis>, donc
  93. <classname>Zend_TimeSync</classname> changera de serveur si la réponse du serveur actuellement interrogé met plus d'une
  94. seconde à arriver.</para>
  95. <para>Grâce à <code>setOptions()</code>, vous passez un tableau d'options que vous voulez. La clé du tableau
  96. représente le nom de l'option en question et la valeur, sa valeur. Pour voir les options déjà affectées,
  97. utilisez la méthode <code>getOptions()</code>. Elle accepte une clé nommant l'option à récupérer, ou alors si
  98. aucun paramètre ne lui est passé, la méthode retournera toutes les options connues.</para>
  99. <programlisting role="php"><![CDATA[
  100. Zend_TimeSync::setOptions(array('timeout' => 3, 'myoption' => 'timesync'));
  101. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
  102. 'fallback' => 'ntp:\\1.pool.ntp.org'));
  103. $server->addServer('sntp:\\internal.myserver.com', 'additional');
  104. print $server->getDate()->getIso();
  105. print_r(Zend_TimeSync::getOptions();
  106. print "Timeout = " . Zend_TimeSync::getOptions('timeout');
  107. ]]></programlisting>
  108. <para>Comme vous pouvez le noter, les options de <classname>Zend_TimeSync</classname> sont statiques, ainsi chaque
  109. instance de <classname>Zend_TimeSync</classname> possèdera les mêmes options.</para>
  110. </sect2>
  111. <sect2 id="zend.timesync.working.different">
  112. <title>Utiliser des serveurs de temps différents</title>
  113. <para>Par défaut la requête utilisera le premier serveur défini, et ainsi de suite. Il peut être nécessaire
  114. parfois, de spécifier un serveur précis que l'on souhaite interroger. Utilisez <code>setServer()</code> et
  115. passez lui le nom du serveur que vous souhaitez interroger prochainement. Pour savoir le serveur qui va être
  116. utilisé, <code>getServer()</code> vous sera utile.</para>
  117. <programlisting role="php"><![CDATA[
  118. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
  119. 'fallback' => 'ntp:\\1.pool.ntp.org'));
  120. $server->addServer('sntp:\\internal.myserver.com', 'additional');
  121. $actual = $server->getServer();
  122. $server = $server->setServer('additional');
  123. ]]></programlisting>
  124. </sect2>
  125. <sect2 id="zend.timesync.working.informations">
  126. <title>Informations sur les serveurs de temps</title>
  127. <para>Les serveurs de temps fournissent certes le temps, mais aussi d'autres informations. Pour prendre
  128. connaissance de ces informations, utilisez la méthode <code>getInfo()</code>.</para>
  129. <programlisting role="php"><![CDATA[
  130. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
  131. 'fallback' => 'ntp:\\1.pool.ntp.org'));
  132. print_r ($server->getInfo());
  133. ]]></programlisting>
  134. <para>Des protocoles et des serveurs différents, retourneront des informations différentes.</para>
  135. </sect2>
  136. <sect2 id="zend.timesync.working.exceptions">
  137. <title>Gérer les exceptions</title>
  138. <para>Les exceptions sont collectées pour tous les serveurs et sont retournées en tant que tableau. Vous pourrez
  139. ainsi itérer sur vos exceptions, voyez plutôt :</para>
  140. <programlisting role="php"><![CDATA[
  141. $serverlist = array(
  142. // invalid servers
  143. 'invalid_a' => 'ntp://a.foo.bar.org',
  144. 'invalid_b' => 'sntp://b.foo.bar.org',
  145. );
  146. $server = new Zend_TimeSync($serverlist);
  147. try {
  148. $result = $server->getDate();
  149. echo $result->getIso();
  150. } catch (Zend_TimeSync_Exception $e) {
  151. $exceptions = $e->get();
  152. foreach ($exceptions as $key => $myException) {
  153. echo $myException->getMessage();
  154. echo '<br />';
  155. }
  156. }
  157. ]]></programlisting>
  158. </sect2>
  159. </sect1>