Signatur
Beschreibung
SoapClient ermöglicht die Kommunikation mit Webdiensten über das SOAP-Protokoll. Im WSDL-Modus wird eine WSDL-Datei (Web Services Description Language) angegeben, aus der alle verfügbaren Methoden, Parameter und Datentypen automatisch geladen werden. Im Non-WSDL-Modus müssen URI und Location manuell übergeben werden, was mehr Kontrolle, aber auch mehr Konfigurationsaufwand bedeutet.
Über den Konstruktor können zahlreiche Optionen gesetzt werden, darunter Authentifizierung, Proxy-Einstellungen, Komprimierung, Zeichensatz, SOAP-Version sowie Timeout-Werte. Remotemethoden lassen sich direkt als Methoden des Objekts aufrufen oder über __soapCall(). Mit __getLastRequest() und __getLastResponse() können gesendete und empfangene XML-Nachrichten zur Fehlersuche inspiziert werden.
Fehler werden standardmäßig als SoapFault-Ausnahmen geworfen, die mit try/catch abgefangen werden sollten. Alternativ kann die Option 'exceptions' => false gesetzt werden, dann gibt __soapCall() bei Fehlern ein SoapFault-Objekt zurück.
Für Performance-kritische Anwendungen empfiehlt sich das Aktivieren des WSDL-Caches über soap.wsdl_cache_enabled in der php.ini, um wiederholtes Laden der WSDL-Datei zu vermeiden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $wsdl Pflicht | string|null | URI der WSDL-Datei im WSDL-Modus. null aktiviert den Non-WSDL-Modus, bei dem location und uri in options zwingend angegeben werden müssen. |
|
| $options | array | [] | Assoziatives Array mit Konfigurationsoptionen. Wichtige Schlüssel: location (Server-URL), uri (Namespace), soap_version (SOAP_1_1 oder SOAP_1_2), login/password (HTTP-Auth), proxy_host/proxy_port, local_cert/passphrase (SSL), trace (bool, aktiviert Request/Response-Protokollierung), exceptions (bool), cache_wsdl, compression, encoding, connection_timeout. |
Beispiele
WSDL-Modus: Währungsumrechnung aufrufen
<?php
try {
$client = new SoapClient(
'https://www.example.com/currency.wsdl',
['trace' => true, 'exceptions' => true]
);
// Remotemethode direkt aufrufen
$result = $client->ConvertCurrency([
'FromCurrency' => 'USD',
'ToCurrency' => 'EUR',
'Amount' => 100,
]);
echo 'Ergebnis: ' . $result->ConvertCurrencyResult . ' EUR' . PHP_EOL;
// Letzte gesendete XML-Anfrage anzeigen
echo $client->__getLastRequest();
} catch (SoapFault $e) {
echo 'SOAP-Fehler: ' . $e->getMessage();
}
Non-WSDL-Modus mit manuellen Parametern
<?php
try {
$client = new SoapClient(null, [
'location' => 'https://api.example.com/soap/endpoint',
'uri' => 'https://api.example.com/soap',
'soap_version' => SOAP_1_2,
'trace' => true,
'exceptions' => true,
]);
// Methode via __soapCall mit expliziten Parametern
$result = $client->__soapCall('GetUserInfo', [
new SoapParam(42, 'userId'),
]);
var_dump($result);
} catch (SoapFault $e) {
echo 'Fehler (' . $e->faultcode . '): ' . $e->faultstring;
}
Verfügbare Methoden und Typen aus WSDL auslesen
<?php
$client = new SoapClient('https://www.example.com/service.wsdl');
// Alle vom Server bereitgestellten Methoden auflisten
$functions = $client->__getFunctions();
foreach ($functions as $func) {
echo $func . PHP_EOL;
}
// Alle definierten SOAP-Typen ausgeben
$types = $client->__getTypes();
foreach ($types as $type) {
echo $type . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheit: Beim Einsatz von local_cert und passphrase für Client-Zertifikate darauf achten, dass Zertifikatsdateien außerhalb des Web-Roots liegen und nicht öffentlich abrufbar sind. Zugangsdaten in login/password niemals im Klartext in versionierten Dateien speichern.
WSDL-Cache: Im Produktionsbetrieb sollte soap.wsdl_cache_enabled = 1 in der php.ini aktiv sein. Beim Entwickeln empfiehlt sich WSDL_CACHE_NONE als Wert für cache_wsdl, damit Änderungen an der WSDL sofort wirksam werden.
Debugging: Die Option 'trace' => true muss gesetzt sein, damit __getLastRequest(), __getLastResponse(), __getLastRequestHeaders() und __getLastResponseHeaders() funktionieren. Im Produktivbetrieb sollte trace deaktiviert werden, um unnötigen Overhead zu vermeiden.
Timeout: connection_timeout steuert nur den Verbindungsaufbau. Für den gesamten Request-Timeout muss default_socket_timeout in der php.ini oder per ini_set() angepasst werden.