Datenanalyse: Neuer PHP-Client für Elasticsearch 8

Das Unternehmen Elastic hat einen komplett überarbeiteten PHP-Client für das eigene Datenanalysetool angekündigt, der PHP Standards Recommendations konform ist.

Lesezeit: 4 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen

(Bild: Gorodenkoff/Shutterstock.com)

Von
  • Frank-Michael Schlede

Elastic hat den PHP-Client für sein Datenanalysetool Elasticsearch von Grund auf neu geschrieben. Neben der Übernahme der PHP Standards Recommendations (PSRs) haben die Entwickler im Zuge dieser Überarbeitung auch die Architektur des Clients umgestaltet und die HTTP-Transportschicht nach außen verlagert. Dank einer HTTPlug-Bibliothek ist nun auch ein "pluggable System" verfügbar.

Für die Programmierung von Elasticsearch mit PHP verwendet das Unternehmen die elasticsearch-php-Bibliothek. Sie stellt insgesamt mehr als 400 Endpunkte von Elasticsearch für eine Haupt-Client-Klasse zur Verfügung. In der vorherigen Version 7 dieser Bibliothek wurden alle diese Endpunkte durch Funktionen abgebildet. So hat die Bibliothek zum Beispiel die Index-API mittels der Methode Client::index() dargestellt. Die Funktion gibt in diesem Fall ein assoziatives Array zurück, das die Deserialisierung der HTTP-Antwort von Elasticsearch darstellt. Bei einer solchen Deserialisierung wird aus einer Byte-Folge wieder ein programmierbares Objekt erzeugt. Diese Antwort wird dann in der Regel durch eine JSON-Nachricht dargestellt und mit Hilfe der json_decode()-Funktion von PHP in ein Array umgewandelt.

Tritt ein Fehler auf, so gibt der Client eine entsprechende Exception aus. Wenn die HTTP-Antwort beispielsweise 404 lautet, löst der Client eine Missing404Exception aus. Möchten Programmiererinnen oder Programmierer die HTTP-Antwort selbst abrufen, mussten sie dazu bisher die letzte Antwort des Clients mit folgendem Code abrufen:

$response = $client->info();
$last = $client->transport->getLastConnection()
->getLastRequestInfo();

$request = $last['request']; //associative array HTTP request
var_dump($request);

$response = $last['response']; //associative array HTTP response
echo $response['status']; // 200
echo $response['body']; // the body as string

Bei der Verwendung dieses Codes werden HTTP-Anfrage und -Antwort von der Transportschicht mit den Methoden getLastConnection() und getLastRequestInfo() aufgerufen. Laut Blogeintrag ist der Einsatz dieses Codes für Entwickler nicht ideal, da die Schlüssel des assoziativen Arrays $response recht umfangreich sind. Das ist dann wiederum auf die Verwendung der cURL-Erweiterungen von PHP zurückzuführen.

Die Entwickler bei Elastic haben sich laut Blogeintrag für die Version 8 auf die Abwärtskompatibilität konzentriert und bieten die gleichen APIs wie in Version 7. Das bedeutet, dass sich mit demselben Code eine Verbindung zu Elasticsearch herstellen und ein Endpunktaufruf wie gewohnt ausführen lässt. Der Unterschied liegt in der Antwort. In Version 8 ist die Antwort nun ein Objekt der Elasticsearch-Antwort, das die PSR-7-Antwortschnittstelle und die ArrayAccess-Schnittstelle von PHP implementiert. Dabei hat Elastic die ArrayAccess-Schnittstelle so umgesetzt, dass Programmierer die Antwort auch weiterhin als Array konsumieren können, ohne dass dadurch die Abwärtskompatibilität gefährdet wird.

Minimaler doch wichtiger Unterschied zwischen Version 7 und Version 8 von elasticsearch-php: Der Namensraum wurde durch Einführung des Elastic Root Namespace geändert. (Bild: Elastic)

Der große Unterschied liegt darin, dass das Elastic-Team bei mit der Version 8 den Namensraum geändert und den Elastic Root Namespace eingeführt hat. Der neue Code für Version 8 sieht zunächst einmal gleich aus, aber unter der Haube gibt es Veränderungen. Wie schon erwähnt ist $response in Version 8 ein Objekt, während es sich in Version 7 noch um ein assoziatives Array handelt. Wer weiterhin das gleiche Verhalten wie in Version 7 wünscht, kann die Antwort als Array serialisieren, indem er die Funktion $response->asArray() verwendet. Zudem stehen auch die Funktionen asObject(), asString() und asBool() zur Verfügung, um den Body als Objekt der PHP-Standardklasse (stdClass), als String oder Boolean zu serialisieren.

Neben einer ganzen Reihe weiterer Verbesserungen, die im Blogbeitrag ausführlich vorgestellt werden, verwendet der neue PHP-Client für Elasticsearch laut diesem Bericht weniger Code im Vergleich zu Version 7. Danach ist die neue Version 8 etwa ein Drittel so groß wie die vorherige Version. Auch der Speicherverbrauch wurde demnach optimiert: Die elasticsearch-php Version 8 implementiert einen "Lazy-Loading"-Mechanismus, um das Laden des API-Namespaces zu optimieren. Das heißt, wenn Programmierer nur eine Teilmenge der über 400 Endpunkte verwenden, werden auch nicht alle Spezifikationen in den Speicher geladen.

(fms)