©
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
[#1] digibrisk at gmail dot NOSPAM dot SPAMNO dot com [2007-10-05 03:24:35]
Adding to what giunta dot gaetano at sea-aeroportimilano dot it and astrolox at lawyersonline dot co dot uk said about the Sourceforge PHP XML-RPC project: You can probably use function_exists() to determine whether the extension is installed so you don't have to incur performance costs. If it's not installed, then the function won't exist, and function_exists() returns false. You can then fall back on the alternative library if that's the case. For example:
<?php
if(!function_exists("xmlrpc_server_create")) {
// include necessary files.
}
?>
[#2] handco at gmail dot com [2007-02-20 08:19:47]
Hi,
A little snippet to implement OO XML RPC Server.
File RPCPlugin.php :
class RPCPlugins {
private $plugins;
function __construct ($pathname, $rpcServer) {
$d = dir($pathname);
while (($file = $d->read()) !== false) {
if (ereg('(.*)\.php$', $file, $regs)) {
include_once ($pathname . '/' . $file);
$class=$regs[1];
$this->plugins = new $class($rpcServer);
}
}
}
}
class RPCPlugin {
private $_rpcServer;
function __construct($rpcServer) {
$this->_rpcServer = $rpcServer;
$methods = get_class_methods($this);
foreach ($methods as $method) {
if (substr($method, 0,1) != '_') {
xmlrpc_server_register_method($rpcServer,get_class($this) . "." . $method,array(&$this,$method));
}
}
}
}
An example of plugin in plugins/Test.php :
class Test extends RPCPlugin {
function HelloWorld ($method, $params) {
return "Hello World --->>" . $params[0];
}
}
Now the real server :
require_once 'RPCPlugin.php';
$rpcServer = xmlrpc_server_create();
$plugins = new RPCPlugins(realpath('plugins/'), $rpcServer);
$resp = xmlrpc_server_call_method($rpcServer,$HTTP_RAW_POST_DATA,null);
if ($resp) {
header ('Content-Type: text/xml');
echo $resp;
}
xmlrpc_server_destroy($rpcServer)
Then you can call ethod by classname.method.
For this sample Test.HelloWorld
Hn'Co
[#3] giunta dot gaetano at sea-aeroportimilano dot it [2006-09-13 06:40:51]
If you need to use this extension but are stuck on a server where it can not be installed, the php-xmlrpc library found at http://phpxmlrpc.sourceforge.net includes an emulation layer that aims to be 100% compatible with the API of the native extension (as part of the "extras" package since version 0.2).
This means your code should be able to run unmodified on top of the php-xmlrpc library. Of course performance will be at least an order of magnitude worse...
[#4] keithNO dot SPAMthornhill at gmail dot com [2006-05-17 02:16:44]
for others attempting the same thing, here is what a function would look like if you wanted to send a base64 encoded file from a client and then save it onto the server. the other code necessary to call this function via an RPC is available in other comments so i won't repeat it.
parameters:
1 - name of file
2 - base64 encoded data of file
note the use of $file_data->scalar
<?php
function sendFile($method_name, $params, $user_data) {
$file = "/somedir/" . $params[0];
$file_data = $params[1];
$fh = @fopen($file, "wb");
if ($fh) {
if (@fwrite($fh, $file_data->scalar)) {
$msg = "success msg";
} else {
$msg = "couldn't write to file";
}
fclose($fh);
return $msg;
} else {
return "couldn't open file";
}
}
?>
[#5] [2006-03-09 12:47:20]
This XML-RPC Service makes the use XML-RPC very esay.
<?php
function myfunc(){
return $some_array;
}
$ws = new XML_RPC_Server();
$ws->registerFunction('myfunc');
$ws->run();
?>
http://www.pure-php.de/node/31
It creates also a simple docu.
http://www.pure-php.com/php/service.php?doc
[#6] john # curioussymbols com [2005-10-19 04:37:12]
I couldn't make the 'xmlrpc_errors' php.ini setting do anything
noticeable (PHP 4.3.11), so I used the following code to report errors
from my XMLRPC server. Hope it's helpful for someone.
<?php
function return_xmlrpc_error($errno,$errstr,$errfile=NULL,$errline=NULL
,$errcontext=NULL){
global $xmlrpc_server;
if(!$xmlrpc_server)die("Error: $errstr in '$errfile', line '$errline'");
header("Content-type: text/xml; charset=UTF-8");
print(xmlrpc_encode(array(
'faultCode'=>$errno
,'faultString'=>"Remote XMLRPC Error from
".$_SERVER['HTTP_HOST'].": $errstr in at $errfile:$errline"
)));
die();
}
set_error_handler('return_xmlrpc_error');
?>
In my server function, I just trigger_error("message",E_USER_ERROR)]
if something can't be completed.
Then on the client side,
<?php
$data =& xmlrpc_decode($response['body']);
if(xmlrpc_is_fault($data)){
trigger_error($data['faultString'],E_USER_ERROR);
}
?>
[#7] martin dot rode at programmfabrik dot de [2005-08-04 05:28:55]
To connect to a python xmlrpc server I use:
function do_call($host, $port, $request) {
$url = "http://$host:$port/";
$header[] = "Content-type: text/xml";
$header[] = "Content-length: ".strlen($request);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
$data = curl_exec($ch);
if (curl_errno($ch)) {
print curl_error($ch);
} else {
curl_close($ch);
return $data;
}
}
$request = xmlrpc_encode_request('add', array(3, 4));
$response = do_call($host, $port, $request);
[#8] astrolox at lawyersonline dot co dot uk [2005-03-22 04:20:10]
The PHP XML-RPC project at SourceForge makes life a hell of a lot easier. However, the project uses some function names which are identical to thoses provided by the XML-RPC extention.
If you are on a server with XML-RPC extension compiled in but wish to use the PHP based version then you will have to rename some of the functions.
I notice that sourceforce says there is activity on the project in 2005 but the last release was January 12, 2003.
I recommend that you use this not so friendly PHP extention if available. However this sourceforce project is still a good idea if you don't control which extenions are be available on the server.
http://phpxmlrpc.sourceforge.net/
[#9] Jerome Delamarche [2004-10-14 02:58:42]
The documentation lacks an example that shows how to send a fault in a response. Here is how to do it:
$args = array("faultCode" => $errcode, "faultString" => $errmsg);
$resp = xmlrpc_encode_request(NULL,$args);
//echo $resp;
[#10] php at hendrik-krauss dot de [2004-08-13 12:38:30]
On "datetime" values:
If you implement an XML-RPC server with these functions and a client calls a method on your server, sending a datetime as parameter (in ISO 8601 format, as specified at http://www.xmlrpc.com/spec), the PHP XML-RPC will pass your registered server method an object as parameter. That object, for example, looks like:
obj->type="datetime"
obj->scalar="20040420T13:32:40"
obj->timestamp=1082460760
If you do xmlrpc_get_type(obj), it will return "datetime", so presumably that function just returns the value of 'type'. 'scalar' seems to be the on-the-wire representation of the datetime (ISO 8601, exactly as received). 'timestamp' appears to be the ISO value in 'scalar' converted into a normal PHP timestamp (i.e. Unix time_t).
Note on 'scalar': Using a MySQL DB, we did something like "select blah where start_time >= $obj->scalar ;". That actually worked and returned expected results, so MySQL appears to handle that ISO 8601 format correctly.
[#11] swunderlin at REMOVE-telemedia dot ch [2004-06-09 03:20:51]
pear hs an XML_RPC package, if you can't recompile your php:
http://pear.php.net/package/XML_RPC
[#12] steph at zend dot com [2004-06-08 04:04:23]
It took me a while to get a client together without external libraries. This very basic client/server pair works on my home set-up - hopefully it will save the next xml-rpc virgin some grief.
<?php
function do_call($host, $port, $request) {
$fp = fsockopen($host, $port, $errno, $errstr);
$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);
?>
<?php
function lifecycle($method, $params) {
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();
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.
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print $response;
xmlrpc_server_destroy($server);
?>
[#13] mboeren at php dot net [2004-02-25 04:34:15]
Just a quick addition to my previous xmlrpc_client class: since you cannot use remote methods containing capital letters or methods from subhandlers (like 'system.listMethods()'), I added a 'call(...)' method to the class.
<?php
// this method should be copy/pasted in the
// xmlrpc_client class
function call($function)
{
$return = NULL;
$argv = func_get_args();
array_shift($argv); // remove function argument
$this->__call($function, $argv, &$return);
return $return;
}
// now, you can also do
$result = $client->call('system.listMethods');
$sum = client->call('add', '1', '2');
?>
[#14] mboeren at php dot net [2004-02-24 07:01:12]
I use the following code (requires the overload extension) to make developing clients easier:
<?php
include("utils/utils.php"); // from xmlrpc-epi utils
class xmlrpc_client
{
var $url;
var $urlparts;
function xmlrpc_client($url)
{
$this->url = $url;
$this->urlparts = parse_url($this->url);
foreach(array('scheme', 'host', 'user', 'pass', 'path',
'query', 'fragment')
as $part) {
if (!isset($this->urlparts[$part])) {
$this->urlparts[$part] = NULL;
}
}
}
function __call($function, $arguments, &$return)
{
$requestprms['host'] = $this->urlparts['host'];
$requestprms['port'] = $this->urlparts['port'];
$requestprms['uri'] = $this->urlparts['path'];
$requestprms['method'] = $function;
$requestprms['args'] = $arguments;
$requestprms['debug'] = 0;
$requestprms['timeout'] = 0;
$requestprms['user'] = NULL;
$requestprms['pass'] = NULL;
$requestprms['secure'] = 0;
$result = xu_rpc_http_concise($requestprms);
if (is_array($result) && isset($result['faultCode'])) {
print('Error in xmlrpc call \''.$function.'\''."\n");
print(' code : '.$result['faultCode']."\n");
print(' message: '.$result['faultString']."\n");
return false;
}
$return = $result;
return true;
}
}
overload('xmlrpc_client');
?>
[#15] bmichael at goldparrot dot com [2003-02-08 21:52:35]
If anyone is interested in making XMLRPC requests directly from the client, I have been able to get xmlrpc to
work with vcXMLRPC javascript backend.
After about 1 week of scanning the market, I found this solution to be the best on Javascript back end. It uses the Microsoft.HTTP activeX control for IE, or HTTPRequest Object for Mozilla.
You include vc(Virtual Cowboys) vcXMLRPC.js file into your pages and make the rpc calls from with javascript to create the requests.
It works both ways.
Two Notes:
I have tested it on IE 6.02 and you need to change lines in ProcessRequest :
function to read:
dom = this.getObject("XMLDOM",http.responseText);
and change the getObject function to use the latest ActiveX Control:
MSXML2.XMLHTTP.3.0 (or 4.0)
MSXML2.DOMDocument.3.0 (or 4.0)
The controls are found on MSDN in the Web Services -> XML area.
As another note, you DO NOT NEED the rpcproxy.cgi script to use this. That is a proxy script to get around JS Security. You can use PHP to build the proxy. But, I was able to get the CGI working with GCC compiler on Solaris (change the -KPCI, depend and -x03 optimizer settings in the Makefile )
[#16] steve at orangeNOSPAMimagineering dot com [2002-08-24 13:32:55]
There's a handy library by Keith Devens (version 2.2.1) at
http://www.keithdevens.com/software/xmlrpc/
Here is a sample client. It remotely calls sample.sumAndDifference
with two parameters (3 and 5).
It returns:
sum => 8
difference => -2
<?php
include ("kd_xmlrpc.php");
// define("XMLRPC_DEBUG", 0); // Set to 1 for handy debugging
$method = "sample.sumAndDifference";
$params = XMLRPC_prepare(array(3,5));
$site = "xmlrpc-c.sourceforge.net";
$location = "/api/sample.php";
list($success, $result) = XMLRPC_request( $site, $location, $method, $params );
// XMLRPC_debug_print(); // uncomment for debugging
foreach ( $result as $key => $value ) {
echo(" $key => $value \n");
}
?>
[#17] hfuecks at pinkgoblin dot com [2002-08-15 08:32:55]
This extension does not handle the process of making making XML-RPC client requests via HTTP; it only prepares the XML-RPC request payload.
This differs from many other XML-RPC implementations but offers greater flexibility, allowing SSL connections, authentication headers and XML-RPC via other transports like SMTP.
[#18] ivanr at webkreator dot com [2002-06-21 11:50:23]
For a really easy way to use this XML-RPC extension take a look at
XML-RPC Class Server (http://www.webkreator.com/php/xcs/)
It automatically creates servers out of PHP classes. Creating clients is almost as easy, especially with the recent addition of the overload extension to PHP (see http://www.php.net/manual/en/ref.overload.php).
[#19] nic at uklinux dot NOSPAM dot net [2002-04-24 09:05:41]
An alternative XML-RPC implementation is available at http://xmlrpc.usefulinc.com - it's written in PHP so you can use it on servers for which you don't have the luxury of rebuilding PHP on.
nic