Hallo alle zusammen!
Ich wälze schon seit gestern Mittag Foren und zerbreche mir den kopf, aber ich komme einfach nicht darauf.
Ich habe eine Testclient.php und eine Testserver.php auf dem gleichen Server im gleichen Verzeichnis liegen (mittlerweile sogar nachweislich funktionierende Codebeispiele aus php.net). Die PHP-Version ist 5.2.0.
Mein Problem ist folgendes:
Ich bekomme beim Aufruf immer die Meldung 'faultString server error. method not found. faultCode -32601'
Nach einigem hin und her konnte ich das Problem eingrenzen. Hier ist das Problem, dass die Variable $HTTP_RAW_POST_DATA nicht gefüllt ist. Dies ist allerdings ein allgemein bekannter bug. Allerdings brachten auch die Lösungsvorschläge always_populate_raw_post_data auf on zu setzen oder stattdessen file_get_contents('php://input'); zu verwenden kein brauchbares Ergebnis. Sowohl $HTTP_RAW_POST_DATA als auch file_get_contents('php://input')sind bei mir immer leer.
Hat vielleicht von euch jemand noch eine Idee oder sogar schon eine konkrete Lösung wie dieses Problem gefixed werden kann?
Die Dateien sehen wie folgt aus:
/* clienttest.php */
<?php
function do_call($host, $port, $request) {
$fp = fopen('/home/servertest.php', 'r');
$query = "POST /home/servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";
if (!fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return 0;
}
$contents = '';
while (!feof($fp)) {
$contents .= fgets($fp);
}
fclose($fp);
return $contents;
}
$host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* do something with $response, e.g. print it */
?>
/* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */
switch($params[0]) {
case 'egg':
$reply = 'All eggs will be birds one day.';
break;
default:
$reply = 'That must have been an otheregg';
}
return $reply;
}
$server = xmlrpc_server_create();
/* register the 'external' name and then the 'internal' name */
xmlrpc_server_register_method($server, "cycle", "lifecycle");
$request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.
/* the parameters here are 'server, xml-string and user data'. There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print $response;
xmlrpc_server_destroy($server);
?>
Vielen Dank schon mal für das Gedanken darüber machen :)
Liebe Grüße,
Amá