Signatur
Beschreibung
SolrClient ist die zentrale Klasse der PECL-Erweiterung solr und kapselt die HTTP-Kommunikation mit einem Apache Solr-Server. Über eine einzige Instanz lassen sich Dokumente hinzufügen, aktualisieren, löschen sowie Volltextsuchen und facettierte Abfragen ausführen.
Die Verbindungsparameter (Host, Port, Pfad, Authentifizierung, Timeout usw.) werden beim Erstellen der Instanz über ein assoziatives Array übergeben. Die Klasse verwendet intern libcurl, um die Requests als HTTP-POST oder HTTP-GET abzusetzen. Alle Antworten werden als SolrQueryResponse-, SolrUpdateResponse- oder SolrGenericResponse-Objekte zurückgegeben.
Wichtige Einschränkungen: Das Klonen (clone $client) und das Serialisieren (serialize() / unserialize()) von SolrClient-Instanzen werden ausdrücklich nicht unterstützt und führen zu einem Fehler. Für lang laufende Prozesse empfiehlt sich daher das Halten exakt einer Instanz pro Request.
Die Erweiterung ist für PHP 5 und PHP 7/8 verfügbar und muss über PECL installiert werden (pecl install solr). Sie setzt einen laufenden Apache Solr-Server (ab Version 1.3) voraus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $clientOptions Pflicht | array | Assoziatives Array mit Verbindungsoptionen. Mögliche Schlüssel: hostname (Standard: localhost), login, password, port (Standard: 8983), path (Standard: /solr), wt (Antwortformat, Standard: xml), secure (bool, HTTPS), timeout, ssl_cert, ssl_key, ssl_cainfo, ssl_capath, proxy_host, proxy_port, proxy_login, proxy_password. |
Beispiele
Verbindung herstellen und ein Dokument indizieren
<?php
// Verbindungsparameter
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/mycore',
];
$client = new SolrClient($options);
// Neues Solr-Dokument erstellen
$doc = new SolrInputDocument();
$doc->addField('id', '42');
$doc->addField('title', 'PHP und Apache Solr');
$doc->addField('author', 'Max Mustermann');
$doc->addField('price', 29.99);
// Dokument senden
$updateResponse = $client->addDocument($doc);
// Änderungen permanent machen
$client->commit();
echo 'Dokument erfolgreich indiziert.' . PHP_EOL;
print_r($updateResponse->getResponse());
Volltextsuche ausführen und Ergebnisse auswerten
<?php
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/mycore',
];
$client = new SolrClient($options);
// Suchanfrage aufbauen
$query = new SolrQuery();
$query->setQuery('PHP');
$query->setStart(0);
$query->setRows(10);
$query->addField('id')->addField('title')->addField('author');
// Anfrage senden
$queryResponse = $client->query($query);
// Antwort auswerten
$response = $queryResponse->getResponse();
$numFound = $response->response->numFound;
echo "Treffer: {$numFound}" . PHP_EOL;
foreach ($response->response->docs as $doc) {
echo '[' . $doc->id . '] ' . $doc->title . ' — ' . $doc->author . PHP_EOL;
}
Dokument löschen und Core optimieren
<?php
$options = [
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/mycore',
];
$client = new SolrClient($options);
// Einzelnes Dokument nach ID löschen
$client->deleteById('42');
// Alle Dokumente eines Autors löschen
$client->deleteByQuery('author:"Max Mustermann"');
// Änderungen bestätigen
$client->commit();
// Index optimieren (zeitintensiv, selten aufrufen)
$client->optimize();
echo 'Dokument gelöscht und Index optimiert.' . PHP_EOL;
// Wichtig · Fallstricke
Klonen und Serialisieren nicht unterstützt: Der Versuch, eine SolrClient-Instanz zu klonen (clone) oder zu serialisieren (serialize()), wirft eine SolrIllegalOperationException. Instanzen dürfen daher nicht in Sessions oder Caches gespeichert werden.
Fehlerbehandlung: Netzwerk- oder Serverfehler werden als SolrClientException geworfen; fehlerhafte Anfragen oder Serverantworten als SolrServerException. Beide sollten immer mit try/catch abgefangen werden.
Authentifizierung: Bei passwortgeschützten Solr-Instanzen die Optionen login und password übergeben. Für HTTPS secure => true setzen und ggf. SSL-Zertifikatspfade angeben.
Performance: Mehrere Dokumente sollten gebündelt mit addDocuments() (Array von SolrInputDocument-Objekten) statt in einer Schleife mit einzelnen addDocument()-Aufrufen gesendet werden, um den HTTP-Overhead zu minimieren.