Webservices mit PHP überwachen

Ich arbeite derzeit in einem Projekt, bei dem wir auf externe Webservices zugreifen müssen. Nun ist es so, dass wir leider keinerlei Einfluß auf diese externen Resourcen haben, aber stark von ihnen abhängig sind. Normalerweise bekommen wir Schnittstellenänderungen immer erst dann mit, wenn das System schon am Boden liegt. Glücklicherweise bietet die externen Services eine Methode an, die als Rückgabewert die Versionsnummer hat. Und dafür habe ich ein PHP Script geschrieben.

Das PHP Script macht nichts weiter als einen Webservice zu initialisieren und dann die entsprechende Methode aufzurufen. Der Rückgabewert, also die Versionsnummer, wird dann in eine Datenbank geschrieben und letztlich auch mit der des voran gegangenen Aufrufs verglichen. Wird eine Abweichung oder nicht Verfügbarkeit des Services festgestellt, so verschickt das Script automatisch mit Hilfe der PEAR-Mailklassen eine Benachrichtigungsmail.

Für das Aufrufen von https:// Webservices muss beim Apache in der php.ini das Modul für SSL Verbindungen aktiv sein.

Bitte entschuldigt die fehlerhafte Einrückung hier, bekomme das gerade nicht anders dargestellt.

[code=’php‘]
// Konfiguration START
$dbHost = „“;
$dbUser = „“;
$dbPass = „“;
$dbName = „“;
$dbTable = „“;

$serviceWSDL = „“;
$serviceName = „“;

$mailTo = „“;
$mailFrom = „“;
$mailHost = „“;
$mailUser = „“;
$mailPass = „“;
// Konfiguration ENDE

// Eigentliches Script…
error_reporting(E_ALL);

// Datenbankverbindung aufbauen
mysql_connect($dbHost, $dbUser, $dbPass) || die(„connection failed“);
mysql_select_db($dbName) || die(„db select failed“);

// Alte Revision herausfinden
$sql = „SELECT * FROM “ . $dbTable . “ ORDER BY datum DESC LIMIT 1″;
$q = mysql_query($sql);
$row = mysql_fetch_assoc($q);
$versionAlt = $row[‚revision_ist‘];
if(trim($versionAlt) == „“)
$versionAlt = – 2;

// Weitere Variablen
$versionIst = – 1;
$bemerkung = „“;
$boSendMail = false;

try {
$client = new SoapClient($serviceWSDL);
$r = $client->getWebserviceRevision();
$versionIst = $r->return;

if($versionAlt == – 1 && $versionIst > 0) {
$bemerkung = „Webservice ist wieder erreichbar.“;
$boSendMail = true;
} elseif($versionAlt == $versionIst) {
$bemerkung = „Webservice Revision ist gleich geblieben.“;
} elseif($versionIst != $versionAlt) {
$bemerkung = „Neue Webservice Revision.“;
$boSendMail = true;
}

} catch(Exception $catched) {
$bemerkung = „Fehler beim Webservice Aufruf“;
$boSendMail = true;
$versionIst = – 1;
}

// Update in Datenbank
$sql = „INSERT INTO “ . $dbTable . “ (datum, revision_ist, revision_war, bemerkung)
VALUES (
NOW(), “ . $versionIst . „,“ . $versionAlt . „, ‚“ . $bemerkung . „‚);“;
mysql_query($sql);

// Benachrichtigungsmail schicken
if($boSendMail) {
$mailTXT = „“;
$mailTXT .= „Bemerkung: “ . $bemerkung . „\r\n“;
$mailTXT .= „Datum: “ . date(„d.m.Y H:i:s“) . „\r\n“;
$mailTXT .= „Alte Revision: “ . $versionAlt . „\r\n“;
$mailTXT .= „Neue Revision: “ . $versionIst . „\r\n“;

require_once „Mail.php“;

$subject = $serviceName . “ Notification!“;

$headers = array(‚From‘ => $mailFrom, ‚To‘ => $mailTo, ‚Subject‘ => $subject);
$smtp = Mail::factory(’smtp‘, array(‚host‘ => $mailHost, ‚auth‘ => false, ‚username‘ => $mailUser, ‚password‘ => $mailPass));

$mail = $smtp->send($mailTo, $headers, $mailTXT);

}
[/code]

Das entsprechende SQL Script zum erstellen der Tabelle sieht so aus:

[source=’sql‘]

CREATE TABLE meinTabellenName (
id int(11) NOT NULL auto_increment,
datum datetime NOT NULL,
revision_ist varchar(10) NOT NULL,
revision_war varchar(10) NOT NULL,
bemerkung varchar(500) NOT NULL,
PRIMARY KEY  (id)
)
[/source]

Bei der Umsetzung habe ich auf dieses Tutorial zum Mailverschicken per SMTP Server zurückgegriffen und die PEAR-Bibliothek für eben diese Funktionalität benutzt.