[ZF-10089] Zend_Log
[zend.git] / documentation / manual / ja / module_specs / Zend_TimeSync-Working.xml
blobebc92bd0ad2212255637d8342bbf6e938dd2c45c
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 20807 -->
4 <sect1 id="zend.timesync.working">
6     <title>Zend_TimeSync の動作</title>
8     <para>
9         <classname>Zend_TimeSync</classname> は、指定した任意の
10         <emphasis>NTP</emphasis> タイムサーバあるいは
11         <emphasis>SNTP</emphasis> タイムサーバから実際の時刻を返します。
12         自動的に複数のサーバを処理することができ、シンプルなインターフェイスを提供します。
13     </para>
15     <note>
16         <para>
17             この章のすべてのサンプルでは、一般に公開されているタイムサーバのひとつを使用します。
18             私たちは <emphasis>0.europe.pool.ntp.org</emphasis>
19             を使用しますが、あなたの環境にあわせて最も近いタイムサーバを使うことをお勧めします。
20             詳細は <ulink url="http://www.pool.ntp.org">http://www.pool.ntp.org</ulink>
21             を参照ください。
22         </para>
23     </note>
25     <sect2 id="zend.timesync.working.generic">
27         <title>一般的なタイムサーバへのリクエスト</title>
29         <para>
30             タイムサーバから時刻を取得するのはきわめて簡単です。
31             単に時刻を取得したいタイムサーバを指定するだけでいいのです。
32         </para>
34         <programlisting language="php"><![CDATA[
35 $server = new Zend_TimeSync('0.pool.ntp.org');
37 print $server->getDate()->getIso();
38 ]]></programlisting>
40         <para>
41             このとき <classname>Zend_TimeSync</classname> の裏側では何が起こっているのでしょうか?
42             まず、指定したサーバの構文をチェックします。つまり今回の例では、
43             '<emphasis>0.pool.ntp.org</emphasis>' がタイムサーバのアドレスとして正しい形式かどうかを確認します。
44             それから、<methodname>getDate()</methodname> をコールする際に実際にタイムサーバを設定し、
45             そのサーバの時刻を返します。<classname>Zend_TimeSync</classname>
46             は、スクリプトが動作しているサーバの時刻と返された時刻とを比較し、
47             修正済みの時刻を表す <classname>Zend_Date</classname> オブジェクトを返します。
48         </para>
50         <para>
51             <classname>Zend_Date</classname> やそのメソッドについての詳細は
52             <link linkend="zend.date.introduction"><classname>Zend_Date</classname></link>
53             を参照ください。
54         </para>
56     </sect2>
58     <sect2 id="zend.timesync.working.multiple">
60         <title>複数のタイムサーバ</title>
62         <para>
63             すべてのタイムサーバが常に使用可能で時刻を返してくれるとは限りません。
64             たとえばメンテナンス中などの理由でサーバに到達できないこともありえます。
65             タイムサーバから時刻を取得できなかった場合は、例外が発生します。
66         </para>
68         <para>
69             この問題への対策として、<classname>Zend_TimeSync</classname>
70             では複数のタイムサーバを処理できるようになっており、
71             ひとつのタイムサーバが使用できなくても代替サーバを使用できるようになっています。
72             これを利用するには二通りの方法があります。
73             インスタンスを作成する際にタイムサーバの配列を指定するか、
74             後から <methodname>addServer()</methodname> メソッドでタイムサーバを追加するかのいずれかです。
75         </para>
77         <programlisting language="php"><![CDATA[
78 $server = new Zend_TimeSync(array('0.pool.ntp.org',
79                                   '1.pool.ntp.org',
80                                   '2.pool.ntp.org'));
81 $server->addServer('3.pool.ntp.org');
83 print $server->getDate()->getIso();
84 ]]></programlisting>
86         <para>
87             追加できるタイムサーバの数には制限はありません。
88             あるタイムサーバへの接続に失敗すると、
89             <classname>Zend_TimeSync</classname> はその次に指定されたタイムサーバへの接続を試みます。
90         </para>
92         <para>
93             タイムサーバは複数指定することをお勧めします。
94             その場合は、タイムサーバに名前をつけなければなりません。
95             名前は配列のキーで指定することもできますが、
96             初期化やタイムサーバの追加の際に 2 番目のパラメータで指定することもできます。
97         </para>
99         <programlisting language="php"><![CDATA[
100 $server = new Zend_TimeSync(array('generic'  => '0.pool.ntp.org',
101                                   'fallback' => '1.pool.ntp.org',
102                                   'reserve'  => '2.pool.ntp.org'));
103 $server->addServer('3.pool.ntp.org', 'additional');
105 print $server->getDate()->getIso();
106 ]]></programlisting>
108         <para>
109             タイムサーバの名前を設定することで、
110             特定のタイムサーバにリクエストを送ることができるようになります。
111             その方法については本章の後半で説明します。
112         </para>
114     </sect2>
116     <sect2 id="zend.timesync.working.protocol">
118         <title>タイムサーバのプロトコル</title>
120         <para>
121             タイムサーバにはさまざまな形式があります。
122             公開されているタイムサーバのほとんどは、
123             <emphasis>NTP</emphasis> プロトコルを使用するものです。
124             しかし、それ以外のプロトコルを使用しているサーバもあります。
125         </para>
127         <para>
128             タイムサーバのアドレスに、適切なプロトコルを指定できます。
129             <classname>Zend_TimeSync</classname> がサポートしているプロトコルは 2 種類で、
130             デフォルトのプロトコルは <emphasis>NTP</emphasis> です。
131             NTP しか使用しないのなら、先ほどまでの例のようにプロトコル指定を省略しても構いません。
132         </para>
134         <programlisting language="php"><![CDATA[
135 $server = new Zend_TimeSync(array('generic'  => 'ntp:\\0.pool.ntp.org',
136                                   'fallback' => 'ntp:\\1.pool.ntp.org',
137                                   'reserve'  => 'ntp:\\2.pool.ntp.org'));
138 $server->addServer('sntp:\\internal.myserver.com', 'additional');
140 print $server->getDate()->getIso();
141 ]]></programlisting>
143         <para>
144             <classname>Zend_TimeSync</classname> は複数のタイムサーバを使用できます。
145             特定のプロトコルだけでなく、個々のサーバに対して別のプロトコルも指定できるようになっています。
146         </para>
148     </sect2>
150     <sect2 id="zend.timesync.working.ports">
152         <title>タイムサーバのポートの指定</title>
154         <para>
155             ウェブにおけるさまざまな他のプロトコルと同様、<emphasis>NTP</emphasis> や
156             <emphasis>SNTP</emphasis> にも標準のポート番号があります。
157             NTP が使用するポートは <emphasis>123</emphasis> で、
158             SNTP は <emphasis>37</emphasis> を使用します。
159         </para>
161         <para>
162             しかし、実際には使われているポートが違うこともあります。
163             使用するポートは、サーバごとにアドレス内に指定できます。
164             ポートを指定するには、アドレスに続けてその数字を指定します。
165             ポートを指定しなかった場合は、<classname>Zend_TimeSync</classname> は標準のポートを使用します。
166         </para>
168         <programlisting language="php"><![CDATA[
169 $server = new Zend_TimeSync(array('generic'  => 'ntp:\\0.pool.ntp.org:200',
170                                   'fallback' => 'ntp:\\1.pool.ntp.org'));
171 $server->addServer('sntp:\\internal.myserver.com:399', 'additional');
173 print $server->getDate()->getIso();
174 ]]></programlisting>
176     </sect2>
178     <sect2 id="zend.timesync.working.options">
180         <title>タイムサーバ用のオプション</title>
182         <para>
183             実際のところ <classname>Zend_TimeSync</classname> で使用するオプションはひとつだけで、
184             それも内部的に使用するものです。しかし、必要に応じて任意のオプションを指定して
185             リクエストを送信できます。
186         </para>
188         <para>
189             <emphasis>timeout</emphasis> オプションは、
190             応答がない状態が何秒続けば接続に失敗したとみなすのかを表します。
191             デフォルトの値は <emphasis>1</emphasis> で、
192             タイムサーバからの応答が 1 秒以内に返ってこなかった場合に
193             <classname>Zend_TimeSync</classname> は別のタイムサーバに処理を移します。
194         </para>
196         <para>
197             <methodname>setOptions()</methodname> メソッドを使用すれば、任意のオプションを指定できます。
198             このメソッドには、オプション名とその値を関連付けた配列を指定します。
199             既に設定済みのオプションは、新しい値で上書きされます。
200             どんなオプションが設定されているのかを知りたい場合は
201             <methodname>getOptions()</methodname> メソッドを使用します。
202             このメソッドにキーを指定した場合はそのオプションの値を返します。
203             指定しなかった場合は、すべてのオプションを返します。
204         </para>
206         <programlisting language="php"><![CDATA[
207 Zend_TimeSync::setOptions(array('timeout' => 3, 'myoption' => 'timesync'));
208 $server = new Zend_TimeSync(array('generic'  => 'ntp:\\0.pool.ntp.org',
209                                   'fallback' => 'ntp:\\1.pool.ntp.org'));
210 $server->addServer('sntp:\\internal.myserver.com', 'additional');
212 print $server->getDate()->getIso();
213 print_r(Zend_TimeSync::getOptions();
214 print "Timeout = " . Zend_TimeSync::getOptions('timeout');
215 ]]></programlisting>
217         <para>
218             ご覧のとおり、<classname>Zend_TimeSync</classname> のオプションは静的なものです。
219             つまり、すべての <classname>Zend_TimeSync</classname> のインスタンスで同じ設定が共用されます。
220         </para>
222     </sect2>
224     <sect2 id="zend.timesync.working.different">
226         <title>別のタイムサーバの使用法</title>
228         <para>
229             時間を取得したい場合、デフォルトでは最初に指定したサーバにリクエストを送信します。
230             しかし、別のタイムサーバを指定してリクエストしたほうが便利なこともあります。
231             その場合は <methodname>setServer()</methodname> メソッドを使用します。
232             使用するタイムサーバを指定するには、
233             タイムサーバのエイリアスをこのメソッドのパラメータとして指定します。
234             実際に使われるタイムサーバを知りたい場合は、単に
235             <methodname>getServer()</methodname> メソッドをコールします。
236             タイムサーバのエイリアスを指定すると、そのタイムサーバを返します。
237             パラメータを省略した場合は、現在のタイムサーバを返します。
238         </para>
240         <programlisting language="php"><![CDATA[
241 $server = new Zend_TimeSync(array('generic'  => 'ntp:\\0.pool.ntp.org',
242                                   'fallback' => 'ntp:\\1.pool.ntp.org'));
243 $server->addServer('sntp:\\internal.myserver.com', 'additional');
245 $actual = $server->getServer();
246 $server = $server->setServer('additional');
247 ]]></programlisting>
249     </sect2>
251     <sect2 id="zend.timesync.working.informations">
253         <title>タイムサーバからの情報</title>
255         <para>
256             タイムサーバは、時刻以外にも付加情報を提供します。
257             この情報を取得するには <methodname>getInfo()</methodname> メソッドを使用します。
258         </para>
260         <programlisting language="php"><![CDATA[
261 $server = new Zend_TimeSync(array('generic'  => 'ntp:\\0.pool.ntp.org',
262                                   'fallback' => 'ntp:\\1.pool.ntp.org'));
264 print_r ($server->getInfo());
265 ]]></programlisting>
267         <para>
268             どのような情報が得られるのかは、
269             使用しているプロトコルやサーバによってさまざまに異なります。
270         </para>
272     </sect2>
274     <sect2 id="zend.timesync.working.exceptions">
276         <title>例外処理</title>
278         <para>
279             すべてのタイムサーバで発生した例外は、ひとつの配列にまとめて返されます。
280             発生した例外をすべて処理するには、次の例のようにします。
281         </para>
283         <programlisting language="php"><![CDATA[
284 $serverlist = array(
285         // 無効なサーバを指定します
286         'invalid_a'  => 'ntp://a.foo.bar.org',
287         'invalid_b'  => 'sntp://b.foo.bar.org',
290 $server = new Zend_TimeSync($serverlist);
292 try {
293     $result = $server->getDate();
294     echo $result->getIso();
295 } catch (Zend_TimeSync_Exception $e) {
297     $exceptions = $e->get();
299     foreach ($exceptions as $key => $myException) {
300         echo $myException->getMessage();
301         echo '<br />';
302     }
304 ]]></programlisting>
305     </sect2>
306 </sect1>