Programmer's Reference Guide
| Einführung |
Arbeiten mit Zend_TimeSync
Zend_TimeSync kann die aktuelle Zeit von jedem angegebenen
NTP oder SNTP
Zeitserver zurückgeben. Es kann automatisch mehrere Server handhaben und bietet ein
einfaches Interface.
Hinweis: In allen Beispielen in diesem Kapitel verwenden wir einen der vorhandenen öffentlichen generellen Zeitserver. In unserem Fall 0.europe.pool.ntp.org. Für die eigene Umgebung ist am besten das der näheste öffentliche generelle Zeitserver verwendet wird der am nähesten zur eigenen Position des Servers steht. Siehe » http://www.pool.ntp.org für Details.
Generelle Anfragen von Zeitserver
Die Anfrage der Zeit von einem Zeitserver ist recht einfach. Alles was angegeben werden muß ist der Zeitserver von dem man die Zeit haben will.
$server = new Zend_TimeSync('0.pool.ntp.org');
print $server->getDate()->getIso();
Was passiert also im Hintergrund von Zend_TimeSync? Zuerst wird der
Syntax des angegebenen Servers geprüft. In unserem Beispiel wird also
'0.pool.ntp.org' geprüft und als möglicherweise richtige Adresse für einen
Zeitserver erkannt. Wenn jetzt getDate() aufgerufen wird, wird der aktuell
gesetzte Zeitserver angefragt und er gibt seine eigene Zeit zurück.
Zend_TimeSync berechnet darauf die Differenz zur aktuellen Zeit des
Servers auf dem das Skript läuft und gibt ein Zend_Date Objekt mit der
aktuellen korrigierten Zeit zurück.
Für Details über Zend_Date und dessen Methoden kann unter
Zend_Date nachgesehen werden.
Mehrere Zeitserver
Nicht alle Zeitserver sind immer erreichbar und geben Ihr Zeit zurück. Server haben eine Zeit in der Sie nicht erreichbar sind, zum Beispiel wärend Ihrer Wartung. In solchen Fällen, wenn die Zeit nicht von einem Zeitserver angefragt werden kann, würde man eine Ausnahme erhalten.
Als einfache Lösung kann Zend_TimeSync mehrere Zeitserver behandeln und
unterstützt einen automatischen Fallback Mechanismus. Es gibt zwei unterstützte Wege.
Man kann entweder ein Array von Zeitserver angeben wenn die Instanz erstellt wird. Oder
man kan zusätzliche Zeitserver im Nachhinein mit der addServer() Methode
hinzufügen.
$server = new Zend_TimeSync(array('0.pool.ntp.org',
'1.pool.ntp.org',
'2.pool.ntp.org'));
$server->addServer('3.pool.ntp.org');
print $server->getDate()->getIso();
Es gibt keine Begrenzung in der Anzahl an Zeitservern die hinzugefügt werden können.
Wenn ein Zeitserver nicht erreicht werden kann, dann fällt Zend_TimeSync
zurück und versucht den nächsten angegebenen Zeitserver zu erreichen.
Wenn man mehr als einen Zeitserver angibt, was das Standardverhalten sein sollte, dann sollte man die Server benennen. Man kann entweder die Server mit dem Arrayschlüssel benennen, aber das geht auch mit dem zweiten Parameter wärend der Initiierung oder dem Hinzufügen von anderen Zeitservern.
$server = new Zend_TimeSync(array('generic' => '0.pool.ntp.org',
'fallback' => '1.pool.ntp.org',
'reserve' => '2.pool.ntp.org'));
$server->addServer('3.pool.ntp.org', 'additional');
print $server->getDate()->getIso();
Die Benennung der Zeitserver gibt die Möglichkeit das ein spezieller Zeitserver angefragt werden kann wie man später in diesem Kapitel sieht.
Protokolle von Zeitservern
Es gibt verschiedene Typen von Zeitservern. Die meisten öffentlichen Zeitserver verwenden NTP als Protokoll. Aber es gibt auch andere mögliche Prtokolle.
Man kann das richtige Prokoll mit der Adresse des Zeitservers setzen. Aktuell gibt
es zwei Prokolle die von Zend_TimeSync unterstützt werden. Das
Standardprotokoll ist NTP. Wenn man nur NTP
verwendet kann das Protkoll in der Adresse unterdrückt werden wie im vorher gezeigten
Beispiel.
$server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
'fallback' => 'ntp:\\1.pool.ntp.org',
'reserve' => 'ntp:\\2.pool.ntp.org'));
$server->addServer('sntp:\\internal.myserver.com', 'additional');
print $server->getDate()->getIso();
Zend_TimeSync ist fähig gemischte Zeitserver handzuhaben. Man ist also
nicht auf ein einzelnes Prokoll beschränkt, aber man kann jeden Zeitserver unabhängig
von seinem Protokoll hinzufügen.
Ports für Zeitserver verwenden
Wie jedes Protkoll im World Wide Web, verwenden das NTP und SNTP Protokoll Standardports. Für beide Protokolle ist das der Port 123.
Aber manchmal unterscheidet sich der Port vom Standard. Der zu verwendende Port kann
mit der Adresse für jeden Server definiert werden. Es muß nur die Nummer des Ports
hinter der Adresse hinzugefügt werden. Wenn kein Port definiert wurde, dann verwendet
Zend_TimeSync den Standardport.
$server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org:200',
'fallback' => 'ntp:\\1.pool.ntp.org'));
$server->addServer('sntp:\\internal.myserver.com:399', 'additional');
print $server->getDate()->getIso();
Optionen für Zeitserver
Aktuell gibt es nur eine Option in Zend_TimeSync die intern verwendet
wird. Aber man kann selbstdefinierte Optionen verwendetn wenn man will und diese auch
Abfragen.
Die Option timeout definiert die Anzahl an Sekunden
nach der eine Verbindung als Abgebrochen erkannt wird wenn keine Antwort kommt. Der
Standardwert ist 1, was bedeutet das
Zend_TimeSync auf den nächsten Zeitserver zurückfällt wenn der aktuell
angefragte Server nicht in einer Sekunde antwortet.
Mit der setOptions() Methode kann jede Option gesetzt werden. Sie
akzeptiert ein Array wobei die Schlüssel die zu setzende Option sind und der Wert der
Wert dieser Option. Jede vorher gesetzte Option wird mit dem neuen Wert überschrieben.
Wenn man wissen will welche Optionen gesetzt sind, kann die getOptions()
Methode verwendet werden. Sie akzeptiert entweder einen Schlüssel welcher die gegebene
Option zurückgibt wenn diese gesetzt ist, oder, wenn kein Schlüssel angegeben wird, gibt
Sie alle gesetzten Optionen zurück.
Zend_TimeSync::setOptions(array('timeout' => 3, 'myoption' => 'timesync'));
$server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
'fallback' => 'ntp:\\1.pool.ntp.org'));
$server->addServer('sntp:\\internal.myserver.com', 'additional');
print $server->getDate()->getIso();
print_r(Zend_TimeSync::getOptions();
print "Timeout = " . Zend_TimeSync::getOptions('timeout');
Wie man sieht sind die Optionen für Zend_TimeSync statisch, was bedeutet
das jede Instanz von Zend_TimeSync mit den gleichen Optionen arbeitet.
Verschiedene Zeitserver verwenden
Das Standardverhlaten für die Anfrage einer Zeit ist diese vom ersten gegebenen Server
anzufragen. Manchmal ist es aber sinnvoll einen anderen Zeitserver zu setzen von dem
die Zeit abgefragt werden soll. Das kann mit der setServer() Methode
getan werden. Um den zu verwendenden Zeitserver zu definieren muß einfach der Alias
als Parameter in dieser Methode gesetzt werden. Und um den aktuell verwendeten
Zeitserver zu erhalten kann die getServer() Methode aufgerufen werden.
Wenn kein Parameter angegeben wird, wird der aktuelle Zeitserver zurückgegeben.
$server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
'fallback' => 'ntp:\\1.pool.ntp.org'));
$server->addServer('sntp:\\internal.myserver.com', 'additional');
$actual = $server->getServer();
$server = $server->setServer('additional');
Informationen von Zeitservern
Zeitserver bieten nicht nur die Zeit selbst sondern auch zusätzliche Informationen.
Man kann diese Informationen mit der getInfo() Methode erhalten.
$server = new Zend_TimeSync(array('generic' => 'ntp:\\0.pool.ntp.org',
'fallback' => 'ntp:\\1.pool.ntp.org'));
print_r ($server->getInfo());
Die zurückgegebenen Informationen unterscheiden sich im verwendeten Protokoll und sie unterscheiden sich auch im verwendeten Server.
Auf Ausnahmen achtgeben
Ausnahmen werden für alle Zeitserver gesammelt und werden als Array zurückgegeben. Es ist also möglich durch alle geworfenen Ausnahmen zu laufen wie im folgenden Beispiel gezeigt:
$serverlist = array(
// invalid servers
'invalid_a' => 'ntp://a.foo.bar.org',
'invalid_b' => 'sntp://b.foo.bar.org',
);
$server = new Zend_TimeSync($serverlist);
try {
$result = $server->getDate();
echo $result->getIso();
} catch (Zend_TimeSync_Exception $e) {
$exceptions = $e->get();
foreach ($exceptions as $key => $myException) {
echo $myException->getMessage();
echo '<br />';
}
}
| Einführung |
