Signatur
Beschreibung
SoapServer ermöglicht es, Web-Services auf Basis des SOAP-Protokolls in PHP zu implementieren. Der Server nimmt eingehende SOAP-Anfragen entgegen, leitet sie an registrierte PHP-Klassen oder -Funktionen weiter und gibt die SOAP-Antwort zurück. Dabei wird sowohl SOAP 1.1 als auch SOAP 1.2 unterstützt.
Der Server kann im WSDL-Modus betrieben werden, wobei eine WSDL-Datei die Dienstschnittstelle beschreibt, oder im Non-WSDL-Modus, bei dem der URI des SOAP-Namespaces manuell angegeben wird. Der WSDL-Modus ist für interoperable Dienste empfohlen, da Clients die Dienststruktur automatisch auslesen können.
Zur Verarbeitung von Anfragen werden entweder einzelne Funktionen via addFunction() oder eine komplette Klasse via setClass() registriert. Der eigentliche Dispatch-Vorgang wird durch den Aufruf von handle() gestartet, der die Anfrage parst und die passende Methode aufruft.
Fehler können über fault() als SOAP-Fault zurückgegeben werden. Der Server setzt automatisch den Content-Type-Header auf text/xml, weshalb er typischerweise direkt als HTTP-Endpunkt verwendet wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $wsdl Pflicht | string|null | URI zur WSDL-Datei oder null für den Non-WSDL-Modus. Im Non-WSDL-Modus muss in options der Schlüssel uri angegeben werden. |
|
| $options | array | [] | Assoziatives Array mit Konfigurationsoptionen. Mögliche Schlüssel: uri (Pflicht im Non-WSDL-Modus), actor, encoding, classmap, typemap, cache_wsdl (z. B. WSDL_CACHE_BOTH), send_errors (bool, ob Fehlerdetails gesendet werden sollen), soap_version (SOAP_1_1 oder SOAP_1_2). |
Beispiele
Einfacher SOAP-Server mit WSDL
<?php
// Datei: server.php
class RechnerService {
/**
* Addiert zwei Zahlen und gibt das Ergebnis zurück.
*/
public function addiere(float $a, float $b): float {
return $a + $b;
}
/**
* Multipliziert zwei Zahlen.
*/
public function multipliziere(float $a, float $b): float {
return $a * $b;
}
}
// WSDL-Datei beschreibt die Dienstschnittstelle
$server = new SoapServer('rechner.wsdl');
$server->setClass('RechnerService');
$server->handle();
SOAP-Server im Non-WSDL-Modus mit Fehlerbehandlung
<?php
// Datei: server_nonwsdl.php
function getBenutzer(int $id): array {
$benutzer = [
1 => ['name' => 'Anna Müller', 'email' => 'anna@example.com'],
2 => ['name' => 'Bob Schmidt', 'email' => 'bob@example.com'],
];
if (!isset($benutzer[$id])) {
// Fehler als SOAP-Fault zurückgeben
throw new SoapFault('Client', 'Benutzer nicht gefunden.');
}
return $benutzer[$id];
}
$server = new SoapServer(
null, // Non-WSDL-Modus
[
'uri' => 'http://example.com/soap/benutzer',
'soap_version' => SOAP_1_2,
'send_errors' => false, // Keine PHP-Fehlermeldungen im SOAP-Response
]
);
$server->addFunction('getBenutzer');
$server->handle();
// Beispielaufruf mit SoapClient (in separatem Skript):
// $client = new SoapClient(null, [
// 'location' => 'http://example.com/server_nonwsdl.php',
// 'uri' => 'http://example.com/soap/benutzer',
// 'soap_version' => SOAP_1_2,
// ]);
// $result = $client->getBenutzer(1);
// print_r($result);
WSDL-Caching und Objekt-Persistenz
<?php
// Persistentes Objekt: Zustand bleibt zwischen Anfragen erhalten (Session-basiert)
class ZaehlerService {
private int $zaehler = 0;
public function erhoehen(): int {
return ++$this->zaehler;
}
public function getWert(): int {
return $this->zaehler;
}
}
session_start();
$server = new SoapServer(
'zaehler.wsdl',
['cache_wsdl' => WSDL_CACHE_BOTH]
);
$server->setClass('ZaehlerService');
// Objekt aus Session laden, um Zustand zu persistieren
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
// Wichtig · Fallstricke
Sicherheitshinweise: Setze send_errors in Produktionsumgebungen auf false, um zu vermeiden, dass interne PHP-Fehler und Stack-Traces in der SOAP-Antwort an den Client übermittelt werden.
Im Non-WSDL-Modus fehlt eine formale Dienstbeschreibung; Clients müssen die verfügbaren Methoden und Parameter daher kennen oder aus der Dokumentation entnehmen. Für öffentliche, interoperable Web-Services wird der WSDL-Modus dringend empfohlen.
Die WSDL-Datei wird standardmäßig gecacht. In Entwicklungsumgebungen sollte cache_wsdl auf WSDL_CACHE_NONE gesetzt werden, damit Änderungen an der WSDL sofort wirksam werden.
Deprecation: SOAP-basierte Web-Services gelten in modernen Architekturen zunehmend als veraltet. Für neue Projekte werden REST/JSON-APIs oder gRPC bevorzugt. SoapServer bleibt aber für Legacy-Integrationen und Unternehmensumgebungen relevant.