# 導入

`Zend_TimeSync` は、インターネット時刻 あるいはネットワーク時刻をタイムサーバから取得するものです。 プロトコルとして NTP あるいは SNTP を使用します。 `Zend_TimeSync` を使用すれば、 Zend Framework が稼動しているサーバの時刻設定を気にせずに動作させられるようになります。

サーバの実際の時刻とは独立した立場でいるために、 `Zend_TimeSync` は内部的に NTP や SNTP 経由の実際の時刻とサーバの時刻との差を考慮して動作します。

## 背景

`Zend_TimeSync` はサーバの時刻を変更することはできません。 しかし、実際の時刻とサーバの時刻との差を表す Zend_Date のインスタンスを返します。

## なぜ Zend_TimeSync ?

いったいなぜ `Zend_TimeSync` を使うのでしょう?

複数のサーバで運用されている環境では、通常はタイムサーバを用いて 各サーバの時刻を同期させていることでしょう。 そのようなごく普通の環境なら、必ずしも `Zend_TimeSync` を使う必要はありません。 しかし、タイムサーバを使用できない環境であったり そのようなサービスを実行する権限がなかったりする場合などには便利です。

`Zend_TimeSync` の使用に適した例をいくつかあげてみます。

- タイムサービスのないサーバ

  アプリケーションを動作させているサーバ上でタイムサービスが稼動していない場合は、 アプリケーション内で `Zend_TimeSync` を実装するとよいでしょう。

- 独立したデータベースサーバ

  データベースが別のサーバ上で動作しており、 そのサーバとアプリケーションサーバが NTP や SNTP で接続されていない場合、 データベースにタイムスタンプを格納しようとすると問題が発生する可能性があります。

- 複数サーバ環境

  アプリケーションが複数サーバ環境で動作しており、 サーバ間の時刻が同期していない場合、 あるサーバで実行したアプリケーションと 別のサーバで実行したアプリケーションの間で問題が発生する可能性があります。

- バッチ処理

  バッチファイルやコマンドラインアプリケーションで タイムサービスを使用したい場合、`Zend_TimeSync` が使えるでしょう。

これらのすべての場合について `Zend_TimeSync` は最適なソリューションであり、 サーバ上で何らかのサービスを実行することができない場合にも使用できます。

## NTP とは?

Network Time Protocol (NTP) は、ネットワーク上のパケット交換によってコンピュータシステムの時刻を同期させるプロトコルです。 NTP は UDP ポート 123 を使用します。このプロトコルについての詳細は wikipedia の記事 (日本語) を参照ください。

## SNTP とは?

Simple Network Time Protocol (SNTP) は、ネットワーク上のパケット交換によってコンピュータシステムの時刻を同期させるプロトコルです。 SNTP は UDP ポート 37 を使用します。`NTP` プロトコルに似ていますが、よりシンプルです。

## 問題のある使用法

`Zend_TimeSync` を使用する際は、 時刻同期の仕組みやウェブ自体の仕組みを考慮するようにしましょう。 問題を回避する方法についてここで説明するので、 `Zend_TimeSync` を使う前に熟読しておきましょう。

## どのサーバを使用するか

どのタイムサーバを使用するかは注意して決めなければいけません。 これには、次のような理由があります。

- 距離

  アプリケーションが稼動しているサーバと 使用するタイムサーバの距離です。 ヨーロッパにあるサーバで動作させているのにタヒチのタイムサーバを使用するなんて意味がありません。 常に近場のサーバを選択するようにしましょう。 これにより、リクエストの時間とネットワーク負荷を軽減させることができます。

- 速度

  リクエストが処理されるまでの所要時間も重要です。 いくつかのサーバを試し、いちばんよい結果を得られるサーバを見つけましょう。 到達できない場所にあるサーバにリクエストを送ったりしたら、 無駄に時間をロスしてしまうことになります。

- 負荷分散

  同じサーバを使い続けないようにしましょう。 あまり頻繁に使用し続けると、タイムサーバからリクエストを遮断されてしまうことがあります。 ひとつのアプリケーションでタイムサーバを頻繁に使用するのなら、 ひとつのタイムサーバだけを使うのではなく 後で説明するような (プールを使用する) 方法を使用しましょう。

どうやってタイムサーバを見つけたらいいのでしょう? 一般には、どのタイムサーバでも使用できます。 LAN 内にあるものであってもかまいませんし、 公開されているタイムサーバを使用してもかまいません。 公開されているタイムサーバを使用する場合は、サーバプールを使用しましょう。 サーバプールは、公開されているタイムサーバのアドレスをまとめたもので、 そこにリクエストを送るとプール内のアドレスをランダムに取得できます。 これを使用すれば、リクエストを分散させることができます。 公開サーバプールは各地域ごとに用意されているので、 上に挙げたようなような問題が発生することもありません。

まずは pool.ntp.org で一番近いサーバプールを見つけましょう。たとえばサーバがドイツ国内にあるのなら 0.europe.pool.ntp.org を使用することになるでしょう。