Start · Sprachen · PHP · Referenz · SoapClient

SoapClient

Klasse

Stellt einen Client für SOAP 1.1- und SOAP 1.2-Server bereit und kann sowohl im WSDL- als auch im Non-WSDL-Modus verwendet werden.

seit PHP 5.0.0 Kategorie: http

Signatur

class SoapClient

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();
}
Ergebnis: 92.50 EUR

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.