Zend_TimeSync-Working.xml 13 KB

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