1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20807 -->
4 <sect1 id="zend.timesync.introduction">
9 <classname>Zend_TimeSync</classname> は、インターネット時刻
10 あるいはネットワーク時刻をタイムサーバから取得するものです。
11 プロトコルとして <emphasis>NTP</emphasis>
12 あるいは <emphasis>SNTP</emphasis> を使用します。
13 <classname>Zend_TimeSync</classname> を使用すれば、
14 Zend Framework が稼動しているサーバの時刻設定を気にせずに動作させられるようになります。
18 サーバの実際の時刻とは独立した立場でいるために、
19 <classname>Zend_TimeSync</classname> は内部的に
20 NTP や SNTP 経由の実際の時刻とサーバの時刻との差を考慮して動作します。
28 <classname>Zend_TimeSync</classname> はサーバの時刻を変更することはできません。
29 しかし、実際の時刻とサーバの時刻との差を表す
30 <link linkend="zend.date.introduction">Zend_Date</link> のインスタンスを返します。
35 <sect2 id="zend.timesync.introduction.why">
37 <title>なぜ Zend_TimeSync ?</title>
40 いったいなぜ <classname>Zend_TimeSync</classname> を使うのでしょう?
44 複数のサーバで運用されている環境では、通常はタイムサーバを用いて
45 各サーバの時刻を同期させていることでしょう。
47 <classname>Zend_TimeSync</classname> を使う必要はありません。
48 しかし、タイムサーバを使用できない環境であったり
49 そのようなサービスを実行する権限がなかったりする場合などには便利です。
53 <classname>Zend_TimeSync</classname> の使用に適した例をいくつかあげてみます。
56 <itemizedlist mark='opencircle'>
59 <emphasis>タイムサービスのないサーバ</emphasis>
62 アプリケーションを動作させているサーバ上でタイムサービスが稼動していない場合は、
63 アプリケーション内で <classname>Zend_TimeSync</classname> を実装するとよいでしょう。
68 <emphasis>独立したデータベースサーバ</emphasis>
73 <emphasis>NTP</emphasis> や <emphasis>SNTP</emphasis>
75 データベースにタイムスタンプを格納しようとすると問題が発生する可能性があります。
80 <emphasis>複数サーバ環境</emphasis>
83 アプリケーションが複数サーバ環境で動作しており、
86 別のサーバで実行したアプリケーションの間で問題が発生する可能性があります。
91 <emphasis>バッチ処理</emphasis>
94 バッチファイルやコマンドラインアプリケーションで
95 タイムサービスを使用したい場合、<classname>Zend_TimeSync</classname> が使えるでしょう。
101 これらのすべての場合について <classname>Zend_TimeSync</classname> は最適なソリューションであり、
102 サーバ上で何らかのサービスを実行することができない場合にも使用できます。
107 <sect2 id="zend.timesync.introduction.ntp">
109 <title>NTP とは?</title>
112 Network Time Protocol (<emphasis>NTP</emphasis>)
113 は、ネットワーク上のパケット交換によってコンピュータシステムの時刻を同期させるプロトコルです。
114 NTP は UDP ポート 123 を使用します。このプロトコルについての詳細は
115 <ulink url="http://en.wikipedia.org/wiki/Network_Time_Protocol">wikipedia の記事</ulink>
116 (<ulink url="http://ja.wikipedia.org/wiki/Network_Time_Protocol">日本語</ulink>)
122 <sect2 id="zend.timesync.introduction.sntp">
124 <title>SNTP とは?</title>
127 Simple Network Time Protocol (<emphasis>SNTP</emphasis>)
128 は、ネットワーク上のパケット交換によってコンピュータシステムの時刻を同期させるプロトコルです。
129 SNTP は UDP ポート 37 を使用します。<code>NTP</code>
130 プロトコルに似ていますが、よりシンプルです。
135 <sect2 id="zend.timesync.introduction.problematic">
137 <title>問題のある使用法</title>
140 <classname>Zend_TimeSync</classname> を使用する際は、
141 時刻同期の仕組みやウェブ自体の仕組みを考慮するようにしましょう。
142 問題を回避する方法についてここで説明するので、
143 <classname>Zend_TimeSync</classname>
149 <sect2 id="zend.timesync.introduction.decision">
151 <title>どのサーバを使用するか</title>
154 どのタイムサーバを使用するかは注意して決めなければいけません。
158 <itemizedlist mark='opencircle'>
166 ヨーロッパにあるサーバで動作させているのにタヒチのタイムサーバを使用するなんて意味がありません。
167 常に近場のサーバを選択するようにしましょう。
168 これにより、リクエストの時間とネットワーク負荷を軽減させることができます。
176 リクエストが処理されるまでの所要時間も重要です。
177 いくつかのサーバを試し、いちばんよい結果を得られるサーバを見つけましょう。
178 到達できない場所にあるサーバにリクエストを送ったりしたら、
179 無駄に時間をロスしてしまうことになります。
187 同じサーバを使い続けないようにしましょう。
188 あまり頻繁に使用し続けると、タイムサーバからリクエストを遮断されてしまうことがあります。
189 ひとつのアプリケーションでタイムサーバを頻繁に使用するのなら、
191 後で説明するような (プールを使用する) 方法を使用しましょう。
197 どうやってタイムサーバを見つけたらいいのでしょう?
198 一般には、どのタイムサーバでも使用できます。
199 LAN 内にあるものであってもかまいませんし、
200 公開されているタイムサーバを使用してもかまいません。
201 公開されているタイムサーバを使用する場合は、サーバプールを使用しましょう。
202 サーバプールは、公開されているタイムサーバのアドレスをまとめたもので、
203 そこにリクエストを送るとプール内のアドレスをランダムに取得できます。
204 これを使用すれば、リクエストを分散させることができます。
205 公開サーバプールは各地域ごとに用意されているので、
206 上に挙げたようなような問題が発生することもありません。
210 まずは <ulink url="http://www.pool.ntp.org">pool.ntp.org</ulink>
211 で一番近いサーバプールを見つけましょう。たとえばサーバがドイツ国内にあるのなら
212 <emphasis>0.europe.pool.ntp.org</emphasis>