Start · Sprachen · PHP · Referenz · xmlrpc_server_call_method

xmlrpc_server_call_method

Funktion

Parst eine eingehende XML-RPC-Anfrage und ruft die entsprechend registrierte Methode auf dem Server-Objekt auf.

seit PHP 4.1.0 Kategorie: xml

Signatur

xmlrpc_server_call_method(resource $server, string $xml, mixed $user_data, array $output_options = []): string

Beschreibung

xmlrpc_server_call_method() verarbeitet eine eingehende XML-RPC-Anfrage, die als XML-String übergeben wird. Die Funktion parst den XML-Inhalt, ermittelt den Methodennamen sowie die Parameter und ruft die zuvor über xmlrpc_server_register_method() registrierte PHP-Callback-Funktion auf. Das Ergebnis wird als XML-RPC-Antwort-String zurückgegeben.

Der Parameter $user_data wird direkt an die registrierte Methode weitergegeben und ermöglicht es, kontextspezifische Daten (z. B. Datenbankverbindungen oder Sitzungsinformationen) ohne globale Variablen an die Handler-Funktion zu übergeben.

Über $output_options lässt sich das Ausgabeformat steuern. Mögliche Schlüssel sind z. B. output_type ('php' oder 'xml'), verbosity und escaping, womit das Verhalten bei der Serialisierung der Antwort beeinflusst wird.

Achtung: Die xmlrpc_*-Erweiterung ist seit PHP 8.0 als deprecated markiert und wurde in PHP 8.4 vollständig entfernt. Für neue Projekte sollte auf Bibliotheken wie phpxmlrpc/phpxmlrpc zurückgegriffen werden.

Parameter

Name Typ Default Beschreibung
$server Pflicht resource Ein XML-RPC-Server-Objekt, das zuvor mit xmlrpc_server_create() erzeugt wurde.
$xml Pflicht string Der rohe XML-RPC-Request als String, typischerweise der Inhalt des HTTP-Request-Body ($HTTP_RAW_POST_DATA bzw. php://input).
$user_data Pflicht mixed Beliebige Daten, die unverändert als zweites Argument an die registrierte Handler-Funktion weitergereicht werden. Ermöglicht die Übergabe von Kontext ohne globale Variablen.
$output_options array [] Assoziatives Array mit Ausgabeoptionen. Unterstützte Schlüssel: output_type ('xml' oder 'php'), verbosity ('no_white_space', 'newlines_only', 'pretty'), escaping ('cdata', 'non-ascii', 'non-print', 'markup'), version ('xmlrpc', 'soap 1.1', 'simple') sowie encoding (z. B. 'UTF-8').

Rückgabewert

Typ
string
Beschreibung
Gibt die XML-RPC-Antwort als XML-String zurück, der direkt als HTTP-Response-Body gesendet werden kann. Im Fehlerfall (z. B. unbekannte Methode) wird eine wohlgeformte XML-RPC-Fehlerantwort zurückgegeben.

Beispiele

Einfacher XML-RPC-Server mit registrierter Methode

<?php
// XML-RPC-Server erstellen
$server = xmlrpc_server_create();

// Methode 'rechner.addiere' registrieren
xmlrpc_server_register_method($server, 'rechner.addiere', function(string $method, array $params, mixed $userData): int {
    // $params[0] enthält das Array der übergebenen Parameter
    $a = $params[0][0] ?? 0;
    $b = $params[0][1] ?? 0;
    return $a + $b;
});

// Eingehenden Request einlesen
$requestXml = file_get_contents('php://input');

// Anfrage verarbeiten und Antwort erzeugen
$response = xmlrpc_server_call_method($server, $requestXml, null, [
    'output_type' => 'xml',
    'verbosity'   => 'pretty',
]);

// HTTP-Antwort senden
header('Content-Type: text/xml; charset=UTF-8');
echo $response;

xmlrpc_server_destroy($server);

User-Data zur Übergabe einer Datenbankverbindung nutzen

<?php
// Simulierte Datenbankverbindung
$db = new stdClass();
$db->connected = true;

$server = xmlrpc_server_create();

xmlrpc_server_register_method($server, 'user.getById', function(string $method, array $params, mixed $userData): array {
    // $userData enthält die übergebene DB-Verbindung
    if (!$userData->connected) {
        return xmlrpc_encode_request(null, 'Keine Datenbankverbindung');
    }
    $id = (int)($params[0][0] ?? 0);
    // Simulierter DB-Abruf
    return ['id' => $id, 'name' => 'Max Mustermann'];
});

$xmlRequest = <<<XML
<?xml version="1.0"?>
<methodCall>
  <methodName>user.getById</methodName>
  <params><param><value><int>42</int></value></param></params>
</methodCall>
XML;

$response = xmlrpc_server_call_method($server, $xmlRequest, $db);

header('Content-Type: text/xml; charset=UTF-8');
echo $response;

xmlrpc_server_destroy($server);

// Wichtig · Fallstricke

Deprecation-Hinweis: Die gesamte xmlrpc_*-Erweiterung (PECL-Extension) wurde in PHP 8.0 als deprecated eingestuft und in PHP 8.4 vollständig entfernt. Neuer Code sollte die Bibliothek phpxmlrpc/phpxmlrpc (via Composer) verwenden.

Sicherheit: Der XML-Input aus php://input darf niemals ohne Validierung direkt verarbeitet werden, wenn vertrauensunwürdige Clients Zugriff haben. XML-RPC-Implementierungen können für XXE-Angriffe (XML External Entity Injection) anfällig sein, sofern der verwendete XML-Parser externe Entitäten auflöst. Gegebenenfalls sollte libxml mit LIBXML_NOENT deaktiviert und libxml_disable_entity_loader(true) (PHP < 8.0) gesetzt werden.

Die Funktion liefert bei unbekannten Methoden eine wohlgeformte XML-RPC-Fehlerantwort (Fehlercode 3), anstatt eine PHP-Exception zu werfen. Eigene Fehlerbehandlung sollte innerhalb der registrierten Handler erfolgen.