Signatur
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
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.