Zend_TimeSync-Working.xml 11 KB

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