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.

vorlesen Druckansicht

(Bild: Gorodenkoff/Shutterstock.com)

Lesezeit: 4 Min.
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.

Videos by heise

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)