Zend_TimeSync-Working.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.timesync.working">
  5. <title>Arbeiten mit Zend_TimeSync</title>
  6. <para>
  7. <classname>Zend_TimeSync</classname> kann die aktuelle Zeit von jedem angegebenen
  8. <emphasis role="strong">NTP</emphasis> oder <emphasis role="strong">SNTP</emphasis>
  9. Zeitserver zurückgeben. Es kann automatisch mehrere Server handhaben und bietet ein
  10. einfaches Interface.
  11. </para>
  12. <note>
  13. <para>
  14. Alle Beispiele in diesem Kapitel verwenden einen öfentlichen, generellen
  15. Zeitserver: <emphasis role="strong">0.europe.pool.ntp.org</emphasis>.
  16. Man sollte einen öffentlichen, generellen Zeitserver verwenden der in der Nähe
  17. des eigenen Anwendungsservers steht. Siehe
  18. <ulink url="http://www.pool.ntp.org">http://www.pool.ntp.org</ulink> für Informationen.
  19. </para>
  20. </note>
  21. <sect2 id="zend.timesync.working.generic">
  22. <title>Generelle Anfragen von Zeitserver</title>
  23. <para>
  24. Die Anfrage der Zeit von einem Zeitserver ist einfach. Zuerst gibt man den Zeitserver an
  25. von dem man die Zeit anfragen will.
  26. </para>
  27. <programlisting role="php"><![CDATA[
  28. $server = new Zend_TimeSync('0.pool.ntp.org');
  29. print $server->getDate()->getIso();
  30. ]]>
  31. </programlisting>
  32. <para>
  33. Was passiert also im Hintergrund von <classname>Zend_TimeSync</classname>? Zuerst wird der
  34. Syntax des Timeservers geprüft. In unserem Beispiel wird also
  35. '<code>0.pool.ntp.org</code>' geprüft und als möglicherweise richtige Adresse für einen
  36. Zeitserver erkannt. Wenn jetzt <code>getDate()</code> aufgerufen wird, wird der aktuell
  37. gesetzte Zeitserver angefragt und er gibt seine eigene Zeit zurück.
  38. <classname>Zend_TimeSync</classname> berechnet darauf die Differenz zur aktuellen Zeit des
  39. Servers auf dem das Skript läuft und gibt ein <classname>Zend_Date</classname> Objekt mit der
  40. korrigierten Zeit zurück.
  41. </para>
  42. <para>
  43. Für Details über <classname>Zend_Date</classname> und dessen Methoden siehe unter der Dokumentation
  44. von <link linkend="zend.date.introduction"><classname>Zend_Date</classname></link> nach.
  45. </para>
  46. </sect2>
  47. <sect2 id="zend.timesync.working.multiple">
  48. <title>Mehrere Zeitserver</title>
  49. <para>
  50. Nicht alle Zeitserver sind immer erreichbar und geben Ihr Zeit zurück. Server können wärend
  51. Ihrer Wartung nicht erreichbar sein. Senn die Zeit nicht vom Zeitserver angefragt werden kann,
  52. erhält man eine Ausnahme.
  53. </para>
  54. <para>
  55. <classname>Zend_TimeSync</classname> ist eine einfache Lösung die mehrere Zeitserver behandeln kann und
  56. einen automatischen Fallback Mechanismus bietet. Es gibt zwei unterstützte Wege;
  57. man kann entweder ein Array von Zeitserver angeben wenn die Instanz erstellt wird, oder
  58. zusätzliche Zeitserver zur Instanz durch Verwendung der <code>addServer()</code> Methode
  59. hinzufügen.
  60. </para>
  61. <programlisting role="php"><![CDATA[
  62. $server = new Zend_TimeSync(array('0.pool.ntp.org',
  63. '1.pool.ntp.org',
  64. '2.pool.ntp.org'));
  65. $server->addServer('3.pool.ntp.org');
  66. print $server->getDate()->getIso();
  67. ]]>
  68. </programlisting>
  69. <para>
  70. Es gibt keine Begrenzung in der Anzahl an Zeitservern die hinzugefügt werden können.
  71. Wenn ein Zeitserver nicht erreicht werden kann, dann fällt <classname>Zend_TimeSync</classname>
  72. zurück und versucht den nächsten Zeitserver zu erreichen.
  73. </para>
  74. <para>
  75. Wenn man mehr als einen Zeitserver angibt - was die beste Praxis für <classname>Zend_TimeSync</classname>
  76. ist - sollte man jeden Server benennen. Man kann die Server mit dem Arrayschlüssel, mit dem
  77. zweiten Parameter wärend der Initiierung oder mit dem zweiten Parameter beim Hinzufügen von
  78. anderen Zeitservern, benennen.
  79. </para>
  80. <programlisting role="php"><![CDATA[
  81. $server = new Zend_TimeSync(array('generic' => '0.pool.ntp.org',
  82. 'fallback' => '1.pool.ntp.org',
  83. 'reserve' => '2.pool.ntp.org'));
  84. $server->addServer('3.pool.ntp.org', 'additional');
  85. print $server->getDate()->getIso();
  86. ]]>
  87. </programlisting>
  88. <para>
  89. Die Benennung der Zeitserver gibt die Möglichkeit das ein spezieller Zeitserver
  90. angefragt werden kann wie man später in diesem Kapitel sieht.
  91. </para>
  92. </sect2>
  93. <sect2 id="zend.timesync.working.protocol">
  94. <title>Protokolle von Zeitservern</title>
  95. <para>
  96. Es gibt verschiedene Typen von Zeitservern. Die meisten öffentlichen Zeitserver
  97. verwenden <emphasis role="strong">NTP</emphasis> als Protokoll. Es sind auch
  98. andere Zeit Synchronisations Prtokolle vorhanden.
  99. </para>
  100. <para>
  101. Man kann das richtige Prokoll mit der Adresse des Zeitservers setzen. Aktuell gibt
  102. es zwei Prokolle die von <classname>Zend_TimeSync</classname> unterstützt werden:
  103. <emphasis role="strong">NTP</emphasis> und <emphasis role="strong">SNTP</emphasis>. Das
  104. Standardprotokoll ist <emphasis role="strong">NTP</emphasis>. Wenn man nur <emphasis role="strong">NTP</emphasis>
  105. verwendet kann das Protkoll in der Adresse, wie im vorherigen Beispiel gezeigt, unterdrücken.
  106. </para>
  107. <programlisting role="php"><![CDATA[
  108. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
  109. 'fallback' => 'ntp:\\1.pool.ntp.org',
  110. 'reserve' => 'ntp:\\2.pool.ntp.org'));
  111. $server->addServer('sntp:\\internal.myserver.com', 'additional');
  112. print $server->getDate()->getIso();
  113. ]]>
  114. </programlisting>
  115. <para>
  116. <classname>Zend_TimeSync</classname> kann gemischte Zeitserver verwenden. Man ist also
  117. nicht auf ein einzelnes Prokoll beschränkt, aber man kann jeden Zeitserver unabhängig
  118. von seinem Protokoll hinzufügen.
  119. </para>
  120. </sect2>
  121. <sect2 id="zend.timesync.working.ports">
  122. <title>Ports für Zeitserver verwenden</title>
  123. <para>
  124. Wie bei jedes Protkoll im World Wide Web, verwenden das
  125. <emphasis role="strong">NTP</emphasis> und <emphasis role="strong">SNTP</emphasis>
  126. Protokoll Standardports. NTP verwendet den Port <emphasis role="strong">123</emphasis>,
  127. und SNTP den Port <emphasis role="strong">37</emphasis>.
  128. </para>
  129. <para>
  130. Aber manchmal differiert der Port den das Protokoll verwendet von Standard. Der zu
  131. verwendende Port kann mit der Adresse für jeden Server definiert werden. Es muß nur
  132. die Nummer des Ports nach der Adresse hinzugefügt werden. Wenn kein Port definiert
  133. wurde, dann verwendet <classname>Zend_TimeSync</classname> den Standardport.
  134. </para>
  135. <programlisting role="php"><![CDATA[
  136. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org:200',
  137. 'fallback' => 'ntp:\\1.pool.ntp.org'));
  138. $server->addServer('sntp:\\internal.myserver.com:399', 'additional');
  139. print $server->getDate()->getIso();
  140. ]]>
  141. </programlisting>
  142. </sect2>
  143. <sect2 id="zend.timesync.working.options">
  144. <title>Optionen für Zeitserver</title>
  145. <para>
  146. Es gibt nur eine Option in <classname>Zend_TimeSync</classname> die intern verwendet wird:
  147. <emphasis role="strong">timeout</emphasis>. Man kann aber beliebige selbstdefinierte
  148. Optionen verwenden wenn man will und diese auch Abfragen.
  149. </para>
  150. <para>
  151. Die Option <emphasis role="strong">timeout</emphasis> definiert die Anzahl an Sekunden
  152. nach der eine Verbindung als Abgebrochen erkannt wird wenn keine Antwort kommt. Der
  153. Standardwert ist <emphasis role="strong">1</emphasis>, was bedeutet das
  154. <classname>Zend_TimeSync</classname> auf den nächsten Zeitserver zurückfällt wenn der
  155. angefragte Server nicht in einer Sekunde antwortet.
  156. </para>
  157. <para>
  158. Mit der <code>setOptions()</code> Methode kann jede Option gesetzt werden. Diese Funktion
  159. akzeptiert ein Array wobei die Schlüssel die zu setzende Option sind und der Wert der
  160. Wert dieser Option. Jede vorher gesetzte Option wird mit dem neuen Wert überschrieben.
  161. Wenn man wissen will welche Optionen gesetzt sind, kann die <code>getOptions()</code>
  162. Methode verwendet werden. Sie akzeptiert entweder einen Schlüssel welcher die gegebene
  163. Option zurückgibt wenn diese gesetzt ist, oder, wenn kein Schlüssel angegeben wird, gibt
  164. Sie alle gesetzten Optionen zurück.
  165. </para>
  166. <programlisting role="php"><![CDATA[
  167. Zend_TimeSync::setOptions(array('timeout' => 3, 'myoption' => 'timesync'));
  168. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
  169. 'fallback' => 'ntp:\\1.pool.ntp.org'));
  170. $server->addServer('sntp:\\internal.myserver.com', 'additional');
  171. print $server->getDate()->getIso();
  172. print_r(Zend_TimeSync::getOptions();
  173. print "Timeout = " . Zend_TimeSync::getOptions('timeout');
  174. ]]>
  175. </programlisting>
  176. <para>
  177. Wie man sieht sind die Optionen für <classname>Zend_TimeSync</classname> statisch. Jede Instanz von
  178. <classname>Zend_TimeSync</classname> verwendet die gleichen Optionen.
  179. </para>
  180. </sect2>
  181. <sect2 id="zend.timesync.working.different">
  182. <title>Verschiedene Zeitserver verwenden</title>
  183. <para>
  184. <classname>Zend_TimeSync</classname>'s Standardverhalten für die Anfrage einer Zeit ist diese vom ersten
  185. gegebenen Server anzufragen. Manchmal ist es aber sinnvoll einen anderen Zeitserver zu setzen
  186. von dem die Zeit abgefragt werden soll. Das kann mit der <code>setServer()</code> Methode
  187. getan werden. Um den zu verwendenden Zeitserver zu definieren muß einfach der Alias
  188. als Parameter in dieser Methode gesetzt werden. Und um den aktuell verwendeten
  189. Zeitserver zu erhalten kann die <code>getServer()</code> Methode aufgerufen werden.
  190. Wenn kein Parameter angegeben wird, wird der aktuelle Zeitserver zurückgegeben.
  191. </para>
  192. <programlisting role="php"><![CDATA[
  193. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
  194. 'fallback' => 'ntp:\\1.pool.ntp.org'));
  195. $server->addServer('sntp:\\internal.myserver.com', 'additional');
  196. $actual = $server->getServer();
  197. $server = $server->setServer('additional');
  198. ]]>
  199. </programlisting>
  200. </sect2>
  201. <sect2 id="zend.timesync.working.informations">
  202. <title>Informationen von Zeitservern</title>
  203. <para>
  204. Zeitserver bieten nicht nur die Zeit selbst sondern auch zusätzliche Informationen.
  205. Man kann diese Informationen mit der <code>getInfo()</code> Methode erhalten.
  206. </para>
  207. <programlisting role="php"><![CDATA[
  208. $server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
  209. 'fallback' => 'ntp:\\1.pool.ntp.org'));
  210. print_r ($server->getInfo());
  211. ]]>
  212. </programlisting>
  213. <para>
  214. Die zurückgegebenen Informationen unterscheiden sich im verwendeten Protokoll und sie
  215. unterscheiden sich auch im verwendeten Server.
  216. </para>
  217. </sect2>
  218. <sect2 id="zend.timesync.working.exceptions">
  219. <title>Behandeln von Ausnahmen</title>
  220. <para>
  221. Ausnahmen werden für alle Zeitserver gesammelt und werden als Array zurückgegeben. Es
  222. ist also möglich durch alle geworfenen Ausnahmen zu laufen wie im folgenden Beispiel
  223. gezeigt:
  224. </para>
  225. <programlisting role="php"><![CDATA[
  226. $serverlist = array(
  227. // invalid servers
  228. 'invalid_a' => 'ntp://a.foo.bar.org',
  229. 'invalid_b' => 'sntp://b.foo.bar.org',
  230. );
  231. $server = new Zend_TimeSync($serverlist);
  232. try {
  233. $result = $server->getDate();
  234. echo $result->getIso();
  235. } catch (Zend_TimeSync_Exception $e) {
  236. $exceptions = $e->get();
  237. foreach ($exceptions as $key => $myException) {
  238. echo $myException->getMessage();
  239. echo '<br />';
  240. }
  241. }
  242. ]]>
  243. </programlisting>
  244. </sect2>
  245. </sect1>