1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20807 -->
4 <sect1 id="zend.timesync.working">
6 <title>Zend_TimeSync の動作</title>
9 <classname>Zend_TimeSync</classname> は、指定した任意の
10 <emphasis>NTP</emphasis> タイムサーバあるいは
11 <emphasis>SNTP</emphasis> タイムサーバから実際の時刻を返します。
12 自動的に複数のサーバを処理することができ、シンプルなインターフェイスを提供します。
17 この章のすべてのサンプルでは、一般に公開されているタイムサーバのひとつを使用します。
18 私たちは <emphasis>0.europe.pool.ntp.org</emphasis>
19 を使用しますが、あなたの環境にあわせて最も近いタイムサーバを使うことをお勧めします。
20 詳細は <ulink url="http://www.pool.ntp.org">http://www.pool.ntp.org</ulink>
25 <sect2 id="zend.timesync.working.generic">
27 <title>一般的なタイムサーバへのリクエスト</title>
30 タイムサーバから時刻を取得するのはきわめて簡単です。
31 単に時刻を取得したいタイムサーバを指定するだけでいいのです。
34 <programlisting language="php"><![CDATA[
35 $server = new Zend_TimeSync('0.pool.ntp.org');
37 print $server->getDate()->getIso();
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> オブジェクトを返します。
51 <classname>Zend_Date</classname> やそのメソッドについての詳細は
52 <link linkend="zend.date.introduction"><classname>Zend_Date</classname></link>
58 <sect2 id="zend.timesync.working.multiple">
60 <title>複数のタイムサーバ</title>
63 すべてのタイムサーバが常に使用可能で時刻を返してくれるとは限りません。
64 たとえばメンテナンス中などの理由でサーバに到達できないこともありえます。
65 タイムサーバから時刻を取得できなかった場合は、例外が発生します。
69 この問題への対策として、<classname>Zend_TimeSync</classname>
70 では複数のタイムサーバを処理できるようになっており、
71 ひとつのタイムサーバが使用できなくても代替サーバを使用できるようになっています。
73 インスタンスを作成する際にタイムサーバの配列を指定するか、
74 後から <methodname>addServer()</methodname> メソッドでタイムサーバを追加するかのいずれかです。
77 <programlisting language="php"><![CDATA[
78 $server = new Zend_TimeSync(array('0.pool.ntp.org',
81 $server->addServer('3.pool.ntp.org');
83 print $server->getDate()->getIso();
87 追加できるタイムサーバの数には制限はありません。
89 <classname>Zend_TimeSync</classname> はその次に指定されたタイムサーバへの接続を試みます。
93 タイムサーバは複数指定することをお勧めします。
94 その場合は、タイムサーバに名前をつけなければなりません。
95 名前は配列のキーで指定することもできますが、
96 初期化やタイムサーバの追加の際に 2 番目のパラメータで指定することもできます。
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();
110 特定のタイムサーバにリクエストを送ることができるようになります。
111 その方法については本章の後半で説明します。
116 <sect2 id="zend.timesync.working.protocol">
118 <title>タイムサーバのプロトコル</title>
121 タイムサーバにはさまざまな形式があります。
123 <emphasis>NTP</emphasis> プロトコルを使用するものです。
124 しかし、それ以外のプロトコルを使用しているサーバもあります。
128 タイムサーバのアドレスに、適切なプロトコルを指定できます。
129 <classname>Zend_TimeSync</classname> がサポートしているプロトコルは 2 種類で、
130 デフォルトのプロトコルは <emphasis>NTP</emphasis> です。
131 NTP しか使用しないのなら、先ほどまでの例のようにプロトコル指定を省略しても構いません。
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();
144 <classname>Zend_TimeSync</classname> は複数のタイムサーバを使用できます。
145 特定のプロトコルだけでなく、個々のサーバに対して別のプロトコルも指定できるようになっています。
150 <sect2 id="zend.timesync.working.ports">
152 <title>タイムサーバのポートの指定</title>
155 ウェブにおけるさまざまな他のプロトコルと同様、<emphasis>NTP</emphasis> や
156 <emphasis>SNTP</emphasis> にも標準のポート番号があります。
157 NTP が使用するポートは <emphasis>123</emphasis> で、
158 SNTP は <emphasis>37</emphasis> を使用します。
162 しかし、実際には使われているポートが違うこともあります。
163 使用するポートは、サーバごとにアドレス内に指定できます。
164 ポートを指定するには、アドレスに続けてその数字を指定します。
165 ポートを指定しなかった場合は、<classname>Zend_TimeSync</classname> は標準のポートを使用します。
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();
178 <sect2 id="zend.timesync.working.options">
180 <title>タイムサーバ用のオプション</title>
183 実際のところ <classname>Zend_TimeSync</classname> で使用するオプションはひとつだけで、
184 それも内部的に使用するものです。しかし、必要に応じて任意のオプションを指定して
189 <emphasis>timeout</emphasis> オプションは、
190 応答がない状態が何秒続けば接続に失敗したとみなすのかを表します。
191 デフォルトの値は <emphasis>1</emphasis> で、
192 タイムサーバからの応答が 1 秒以内に返ってこなかった場合に
193 <classname>Zend_TimeSync</classname> は別のタイムサーバに処理を移します。
197 <methodname>setOptions()</methodname> メソッドを使用すれば、任意のオプションを指定できます。
198 このメソッドには、オプション名とその値を関連付けた配列を指定します。
199 既に設定済みのオプションは、新しい値で上書きされます。
200 どんなオプションが設定されているのかを知りたい場合は
201 <methodname>getOptions()</methodname> メソッドを使用します。
202 このメソッドにキーを指定した場合はそのオプションの値を返します。
203 指定しなかった場合は、すべてのオプションを返します。
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');
218 ご覧のとおり、<classname>Zend_TimeSync</classname> のオプションは静的なものです。
219 つまり、すべての <classname>Zend_TimeSync</classname> のインスタンスで同じ設定が共用されます。
224 <sect2 id="zend.timesync.working.different">
226 <title>別のタイムサーバの使用法</title>
229 時間を取得したい場合、デフォルトでは最初に指定したサーバにリクエストを送信します。
230 しかし、別のタイムサーバを指定してリクエストしたほうが便利なこともあります。
231 その場合は <methodname>setServer()</methodname> メソッドを使用します。
233 タイムサーバのエイリアスをこのメソッドのパラメータとして指定します。
234 実際に使われるタイムサーバを知りたい場合は、単に
235 <methodname>getServer()</methodname> メソッドをコールします。
236 タイムサーバのエイリアスを指定すると、そのタイムサーバを返します。
237 パラメータを省略した場合は、現在のタイムサーバを返します。
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');
251 <sect2 id="zend.timesync.working.informations">
253 <title>タイムサーバからの情報</title>
256 タイムサーバは、時刻以外にも付加情報を提供します。
257 この情報を取得するには <methodname>getInfo()</methodname> メソッドを使用します。
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());
269 使用しているプロトコルやサーバによってさまざまに異なります。
274 <sect2 id="zend.timesync.working.exceptions">
279 すべてのタイムサーバで発生した例外は、ひとつの配列にまとめて返されます。
280 発生した例外をすべて処理するには、次の例のようにします。
283 <programlisting language="php"><![CDATA[
286 'invalid_a' => 'ntp://a.foo.bar.org',
287 'invalid_b' => 'sntp://b.foo.bar.org',
290 $server = new Zend_TimeSync($serverlist);
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();