PHP 日本研討會 2024

XML-RPC 函式

目錄

新增註記

使用者貢獻註記 19 則註記

3
astrolox at lawyersonline dot co dot uk
19 年前
SourceForge 上的 PHP XML-RPC 專案讓生活輕鬆許多。但是,該專案使用了一些與 XML-RPC 擴充功能提供的函式名稱相同的函式名稱。

如果您在已編譯 XML-RPC 擴充功能的伺服器上,但希望使用基於 PHP 的版本,則必須重新命名一些函式。

我注意到 sourceforce 說 2005 年該專案有活動,但最後一次發布是在 2003 年 1 月 12 日。

我建議您在可用的情況下使用這個不太友善的 PHP 擴充功能。但是,如果您無法控制伺服器上可用的擴充功能,則這個 sourceforce 專案仍然是一個好主意。

http://phpxmlrpc.sourceforge.net/
3
swunderlin at REMOVE-telemedia dot ch
20 年前
pear hs 有一個 XML_RPC 套件,如果您無法重新編譯您的 php
http://pear.php.net/package/XML_RPC
3
steve at orangeNOSPAMimagineering dot com
22 年前
Keith Devens (版本 2.2.1) 有一個方便的函式庫,網址為
http://www.keithdevens.com/software/xmlrpc/

這是一個範例用戶端。它會遠端呼叫 sample.sumAndDifference
並帶有兩個參數(3 和 5)。
它會傳回

sum => 8
difference => -2

<?php
include ("kd_xmlrpc.php");
// define("XMLRPC_DEBUG", 0); // 設定為 1 以便於偵錯

$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(); // 取消註解以進行偵錯

foreach ( $result as $key => $value ) {
echo(
" $key => $value \n");
}

?>
10
martin dot rode at programmfabrik dot de
19 年前
若要連線到 python xmlrpc 伺服器,我使用

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);
3
keithNO dot SPAMthornhill at gmail dot com
18 年前
對於其他嘗試相同操作的人,如果您想要從用戶端傳送 base64 編碼的檔案,然後將其儲存到伺服器上,以下是一個函式的樣子。透過 RPC 呼叫此函式所需的其他程式碼可在其他註解中找到,因此我不會重複它。

參數
1 - 檔案名稱
2 - 檔案的 base64 編碼資料

請注意 $file_data->scalar 的用法

<?
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 = "無法寫入檔案";
}
fclose($fh);
return $msg;
} else {
return "無法開啟檔案";
}
}
?>
2
php at hendrik-krauss dot de
20 年前
關於「datetime」值

如果您使用這些函式實作 XML-RPC 伺服器,而用戶端呼叫您伺服器上的方法,並將 datetime 作為參數傳送(以 ISO 8601 格式,如 http://www.xmlrpc.com/spec 所指定),則 PHP XML-RPC 會將物件作為參數傳遞給您已註冊的伺服器方法。例如,該物件看起來像
obj->type="datetime"
obj->scalar="20040420T13:32:40"
obj->timestamp=1082460760

如果您執行 xmlrpc_get_type(obj),它會傳回 "datetime",因此推測該函式只會傳回 'type' 的值。'scalar' 似乎是 datetime 的網路表示法(ISO 8601,與接收到的完全相同)。'timestamp' 似乎是 'scalar' 中的 ISO 值轉換為正常的 PHP 時間戳記(即 Unix time_t)。

關於 'scalar' 的說明:使用 MySQL 資料庫,我們執行了類似 "select blah where start_time >= $obj->scalar ;" 的操作。這實際上有效並傳回預期的結果,因此 MySQL 似乎可以正確處理該 ISO 8601 格式。
1
digibrisk at gmail dot NOSPAM dot SPAMNO dot com
17 年前
針對 giunta dot gaetano at sea-aeroportimilano dot it 和 astrolox at lawyersonline dot co dot uk 關於 Sourceforge PHP XML-RPC 專案的說法補充:您可以使用 function_exists() 來判斷是否已安裝擴充功能,這樣您就不必承擔效能成本。如果未安裝,則該函式將不存在,並且 function_exists() 會傳回 false。如果確實如此,您可以回退到替代的函式庫。例如

<?php

if(!function_exists("xmlrpc_server_create")) {
// 包含必要的檔案。
}

?>
3
steph at zend dot com
20 年前
我花了一些時間才在沒有外部函式庫的情況下建立一個客戶端。這個非常基本的客戶端/伺服器配對可以在我的家用環境中運作 - 希望它可以讓下一個 XML-RPC 初學者少走一些冤枉路。

/* clienttest.php */
<?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 = "寫入錯誤";
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);
/* 對 $response 進行某些操作,例如列印它 */
?>

/* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (請求參數的)陣列; 如果有資料要傳遞,則 $data 也會從 xmlrpc_server_call_method 傳遞 */
switch($params[0]) {
case
'egg':
$reply = '所有的蛋終將會變成鳥。';
break;
default:
$reply = '那一定是其他的蛋';
}
return
$reply;
}

$server = xmlrpc_server_create();

/* 註冊 '外部' 名稱,然後註冊 '內部' 名稱 */
xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // 不,你不需要 'always on',而且 $_POST 也不能用。

/* 這裡的參數是 'server、xml 字串和使用者資料'。 理應還有一個可選的 '輸出選項' 陣列,但我無法讓它運作 :( 因此使用 header() 呼叫 */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print
$response;

xmlrpc_server_destroy($server);
?>
1
bmichael at goldparrot dot com
21 年前
如果有人有興趣直接從客戶端發出 XMLRPC 請求,我已經能夠讓 xmlrpc
與 vcXMLRPC javascript 後端一起運作。

經過大約 1 週的市場掃描,我發現這個解決方案是 Javascript 後端的最佳選擇。它對 IE 使用 Microsoft.HTTP activeX 控制項,對 Mozilla 使用 HTTPRequest 物件。

您將 vc (Virtual Cowboys) vcXMLRPC.js 檔案包含到您的網頁中,並從 javascript 發出 rpc 呼叫以建立請求。

它雙向都有效。

兩點注意事項

我已經在 IE 6.02 上測試過它,您需要在 ProcessRequest 中更改程式碼行
function 以讀取

dom = this.getObject("XMLDOM",http.responseText);

並更改 getObject 函式以使用最新的 ActiveX 控制項

MSXML2.XMLHTTP.3.0 (或 4.0)
MSXML2.DOMDocument.3.0 (或 4.0)

這些控制項可以在 MSDN 的 Web 服務 -> XML 區域中找到。

另一個注意事項是,您不需要 rpcproxy.cgi 指令碼來使用它。這是一個代理指令碼,用於繞過 JS 安全性。您可以使用 PHP 來建立代理。但是,我能夠讓 CGI 在 Solaris 上使用 GCC 編譯器運作 (在 Makefile 中更改 -KPCI、depend 和 -x03 優化器設定)
2
匿名
18 年前
這個 XML-RPC 服務讓 XML-RPC 的使用非常簡單。

<?php

/**
* 函式 myfun() 會回傳
*@return array
*/
function myfunc(){
return
$some_array;
}

$ws = new XML_RPC_Server();
$ws->registerFunction('myfunc');
$ws->run();

?>

http://www.pure-php.de/node/31

它也會建立一個簡單的文件。
http://www.pure-php.com/php/service.php?doc
2
giunta dot gaetano at sea-aeroportimilano dot it
18 年前
如果您需要使用此擴充功能,但受限於無法安裝它的伺服器上,則在 http://phpxmlrpc.sourceforge.net 找到的 php-xmlrpc 函式庫包含一個模擬層,旨在與原生擴充功能的 API 100% 相容 (自 0.2 版以來是 "extras" 套件的一部分)。
這表示您的程式碼應該可以在 php-xmlrpc 函式庫之上未經修改地執行。當然,效能至少會差一個數量級...
1
handco at gmail dot com
17 年前
嗨,

一個實現 OO XML RPC 伺服器的小程式碼片段。

檔案 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));
}
}

}

}

plugins/Test.php 中外掛程式的範例

class Test extends RPCPlugin {


function HelloWorld ($method, $params) {
return "Hello World --->>" . $params[0];
}

}

現在是真正的伺服器

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)

然後您可以使用類別名稱.方法呼叫方法。
對於這個範例 Test.HelloWorld

Hn'Co
1
john # curioussymbols com
19 年前
我無法讓 'xmlrpc_errors' php.ini 設定產生任何
明顯的影響 (PHP 4.3.11),所以我使用以下程式碼來報告
來自我的 XMLRPC 伺服器的錯誤。希望它對某些人有幫助。

<?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');
?>

在我的伺服器函式中,我只是使用 trigger_error("訊息", E_USER_ERROR)]
如果某些事情無法完成。

然後在客戶端,
<?php
$data
=& xmlrpc_decode($response['body']);

if(
xmlrpc_is_fault($data)){
trigger_error($data['faultString'],E_USER_ERROR);
}
?>
1
Jerome Delamarche
20 年前
文件中缺少一個範例來示範如何在回應中傳送錯誤。以下是如何做到這點

$args = array("faultCode" => $errcode, "faultString" => $errmsg);
$resp = xmlrpc_encode_request(NULL,$args);
//echo $resp;
2
hfuecks at pinkgoblin dot com
22 年前
這個擴充功能不處理透過 HTTP 發出 XML-RPC 客戶端請求的過程;它只準備 XML-RPC 請求酬載。

這與許多其他 XML-RPC 實作不同,但提供了更大的彈性,允許 SSL 連線、驗證標頭以及透過其他傳輸方式(如 SMTP)進行 XML-RPC。
2
nic at uklinux dot NOSPAM dot net
22 年前
另一個 XML-RPC 實作可在 http://xmlrpc.usefulinc.com 取得 - 它是用 PHP 編寫的,因此您可以在沒有重建 PHP 的伺服器上使用它。

nic
0
mboeren at php dot net
20 年前
只是快速補充我先前的 xmlrpc_client 類別:由於您無法使用包含大寫字母的遠端方法或來自子處理程式的方法(如 'system.listMethods()'),因此我在類別中新增了一個 'call(...)' 方法。

<?php
// 這個方法應該複製/貼上到
// xmlrpc_client 類別中

function call($function)
{
$return = NULL;
$argv = func_get_args();
array_shift($argv); // 移除函式引數
$this->__call($function, $argv, &$return);
return
$return;
}

// 現在,您也可以執行
$result = $client->call('system.listMethods');
$sum = client->call('add', '1', '2');
?>
-2
mboeren at php dot net
20 年前
我使用以下程式碼(需要 overload 擴充功能)來讓開發客戶端更容易

<?php
include("utils/utils.php"); // 來自 xmlrpc-epi utils

/*
用法:
$client = new xmlrpc_client("https://127.0.0.1:7080");
print $client->echo('x')."\n";
print $client->add(1, 3)."\n";

*/
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');

?>
-5
ivanr at webkreator dot com
22 年前
若要輕鬆使用這個 XML-RPC 擴充功能,請查看

XML-RPC 類別伺服器 (http://www.webkreator.com/php/xcs/)

它會自動從 PHP 類別建立伺服器。建立客戶端幾乎一樣容易,特別是最近將 overload 擴充功能新增至 PHP 後(請參閱 https://php.dev.org.tw/manual/en/ref.overload.php)。
To Top