日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP xml-rpc遠程調用

瀏覽:17日期:2024-01-11 08:30:35

從網上找來的XML-RPC庫,對于開發小型的外部通訊接口很有用,把這個代碼保存為xml-rpc.inc.php

<?php/*從網上找來的XML-RPC庫,對于開發小型的外部通訊接口很有用*/function & XML_serialize($data, $level = 0, $prior_key = NULL){#assumes a hash, keys are the variable names$xml_serialized_string = '';while(list($key, $value) = each($data)){$inline = false;$numeric_array = false;$attributes = '';#echo 'My current key is '$key', called with prior key '$prior_key'<br>';if(!strstr($key, ' attr')){ #if it's not an attributeif(array_key_exists('$key attr', $data)){while(list($attr_name, $attr_value) = each($data['$key attr'])){#echo 'Found attribute $attribute_name with value $attribute_value<br>';$attr_value = &htmlspecialchars($attr_value, ENT_QUOTES);$attributes .= ' $attr_name='$attr_value'';}}if(is_numeric($key)){#echo 'My current key ($key) is numeric. My parent key is '$prior_key'<br>';$key = $prior_key;}else{#you can't have numeric keys at two levels in a row, so this is ok#echo 'Checking to see if a numeric key exists in data.';if(is_array($value) and array_key_exists(0, $value)){# echo ' It does! Calling myself as a result of a numeric array.<br>';$numeric_array = true;$xml_serialized_string .= XML_serialize($value, $level, $key);}#echo '<br>';}if(!$numeric_array){$xml_serialized_string .= str_repeat('t', $level) . '<$key$attributes>';if(is_array($value)){$xml_serialized_string .= 'rn' . XML_serialize($value, $level+1);}else{$inline = true;$xml_serialized_string .= htmlspecialchars($value);}$xml_serialized_string .= (!$inline ? str_repeat('t', $level) : '') . '</$key>rn';}}else{#echo 'Skipping attribute record for key $key<bR>';}}if($level == 0){$xml_serialized_string = '<?xml version='1.0' ?>rn' . $xml_serialized_string;return $xml_serialized_string;}else{return $xml_serialized_string;}}class XML {var $parser; #a reference to the XML parservar $document; #the entire XML structure built up so farvar $current; #a pointer to the current item - what is thisvar $parent; #a pointer to the current parent - the parent will be an arrayvar $parents; #an array of the most recent parent at each levelvar $last_opened_tag;function XML($data=null){$this->parser = xml_parser_create();xml_parser_set_option ($this->parser, XML_OPTION_CASE_FOLDING, 0);xml_set_object($this->parser, $this);xml_set_element_handler($this->parser, 'open', 'close');xml_set_character_data_handler($this->parser, 'data');# register_shutdown_function(array($this, 'destruct'));}function destruct(){xml_parser_free($this->parser);}function parse($data){$this->document = array();$this->parent = $this->document;$this->parents = array();$this->last_opened_tag = NULL;xml_parse($this->parser, $data);return $this->document;}function open($parser, $tag, $attributes){#echo 'Opening tag $tag<br>n';$this->data = '';$this->last_opened_tag = $tag; #tag is a stringif(array_key_exists($tag, $this->parent)){#echo 'There's already an instance of '$tag' at the current level ($level)<br>n';if(is_array($this->parent[$tag]) and array_key_exists(0, $this->parent[$tag])){ #if the keys are numeric#need to make sure they're numeric (account for attributes)$key = count_numeric_items($this->parent[$tag]);#echo 'There are $key instances: the keys are numeric.<br>n';}else{#echo 'There is only one instance. Shifting everything around<br>n';$temp = $this->parent[$tag];unset($this->parent[$tag]);$this->parent[$tag][0] = $temp;if(array_key_exists('$tag attr', $this->parent)){#shift the attributes around too if they exist$temp = $this->parent['$tag attr'];unset($this->parent['$tag attr']);$this->parent[$tag]['0 attr'] = $temp;}$key = 1;}$this->parent = $this->parent[$tag];}else{$key = $tag;}if($attributes){$this->parent['$key attr'] = $attributes;}$this->parent[$key] = array();$this->parent = $this->parent[$key];array_unshift($this->parents, $this->parent);}function data($parser, $data){#echo 'Data is '', htmlspecialchars($data), ''<br>n';if($this->last_opened_tag != NULL){$this->data .= $data;}}function close($parser, $tag){#echo 'Close tag $tag<br>n';if($this->last_opened_tag == $tag){$this->parent = $this->data;$this->last_opened_tag = NULL;}array_shift($this->parents);$this->parent = $this->parents[0];}}function & XML_unserialize($xml){$xml_parser = new XML();$data = $xml_parser->parse($xml);$xml_parser->destruct();return $data;}function & XMLRPC_parse($request){if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_parse', '<p>Received the following raw request:</p>' . XMLRPC_show($request, 'print_r', true));}$data = &XML_unserialize($request);if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_parse', '<p>Returning the following parsed request:</p>' . XMLRPC_show($data, 'print_r', true));}return $data;}function & XMLRPC_prepare($data, $type = NULL){if(is_array($data)){$num_elements = count($data);if((array_key_exists(0, $data) or !$num_elements) and $type != 'struct'){ #it's an arrayif(!$num_elements){ #if the array is emptyempty$returnvalue = array('array' => array('data' => NULL));}else{$returnvalue['array']['data']['value'] = array();$temp = $returnvalue['array']['data']['value'];$count = count_numeric_items($data);for($n=0; $n<$count; $n++){$type = NULL;if(array_key_exists('$n type', $data)){$type = $data['$n type'];}$temp[$n] = XMLRPC_prepare($data[$n], $type);}}}else{ #it's a structif(!$num_elements){ #if the struct is emptyempty$returnvalue = array('struct' => NULL);}else{$returnvalue['struct']['member'] = array();$temp = $returnvalue['struct']['member'];while(list($key, $value) = each($data)){if(substr($key, -5) != ' type'){ #if it's not a type specifier$type = NULL;if(array_key_exists('$key type', $data)){$type = $data['$key type'];}$temp[] = array('name' => $key, 'value' => XMLRPC_prepare($value, $type));}}}}}else{ #it's a scalarif(!$type){if(is_int($data)){$returnvalue['int'] = $data;return $returnvalue;}elseif(is_float($data)){$returnvalue['double'] = $data;return $returnvalue;}elseif(is_bool($data)){$returnvalue['boolean'] = ($data ? 1 : 0);return $returnvalue;}elseif(preg_match('/^d{8}Td{2}:d{2}:d{2}$/', $data, $matches)){ #it's a date$returnvalue['dateTime.iso8601'] = $data;return $returnvalue;}elseif(is_string($data)){$returnvalue['string'] = htmlspecialchars($data);return $returnvalue;}}else{$returnvalue[$type] = htmlspecialchars($data);}}return $returnvalue;}function & XMLRPC_adjustValue($current_node){if(is_array($current_node)){if(isset($current_node['array'])){if(!is_array($current_node['array']['data'])){#If there are no elements, return an emptyempty arrayreturn array();}else{#echo 'Getting rid of array -> data -> value<br>n';$temp = $current_node['array']['data']['value'];if(is_array($temp) and array_key_exists(0, $temp)){$count = count($temp);for($n=0;$n<$count;$n++){$temp2[$n] = &XMLRPC_adjustValue($temp[$n]);}$temp = $temp2;}else{$temp2 = &XMLRPC_adjustValue($temp);$temp = array($temp2);#I do the temp assignment because it avoids copying,# since I can put a reference in the array#PHP's reference model is a bit silly, and I can't just say:# $temp = array(&XMLRPC_adjustValue($temp));}}}elseif(isset($current_node['struct'])){if(!is_array($current_node['struct'])){#If there are no members, return an emptyempty arrayreturn array();}else{#echo 'Getting rid of struct -> member<br>n';$temp = $current_node['struct']['member'];if(is_array($temp) and array_key_exists(0, $temp)){$count = count($temp);for($n=0;$n<$count;$n++){#echo 'Passing name {$temp[$n][name]}. Value is: ' . show($temp[$n][value], var_dump, true) . '<br>n';$temp2[$temp[$n]['name']] = &XMLRPC_adjustValue($temp[$n]['value']);#echo 'adjustValue(): After assigning, the value is ' . show($temp2[$temp[$n]['name']], var_dump, true) . '<br>n';}}else{#echo 'Passing name $temp[name]<br>n';$temp2[$temp['name']] = &XMLRPC_adjustValue($temp['value']);}$temp = $temp2;}}else{$types = array('string', 'int', 'i4', 'double', 'dateTime.iso8601', 'base64', 'boolean');$fell_through = true;foreach($types as $type){if(array_key_exists($type, $current_node)){#echo 'Getting rid of '$type'<br>n';$temp = $current_node[$type];#echo 'adjustValue(): The current node is set with a type of $type<br>n';$fell_through = false;break;}}if($fell_through){$type = 'string';#echo 'Fell through! Type is $type<br>n';}switch ($type){case 'int': case 'i4': $temp = (int)$temp; break;case 'string': $temp = (string)$temp; break;case 'double': $temp = (double)$temp; break;case 'boolean': $temp = (bool)$temp; break;}}}else{$temp = (string)$current_node;}return $temp;}function XMLRPC_getParams($request){if(!is_array($request['methodCall']['params'])){#If there are no parameters, return an emptyempty arrayreturn array();}else{#echo 'Getting rid of methodCall -> params -> param<br>n';$temp = $request['methodCall']['params']['param'];if(is_array($temp) and array_key_exists(0, $temp)){$count = count($temp);for($n = 0; $n < $count; $n++){#echo 'Serializing parameter $n<br>';$temp2[$n] = &XMLRPC_adjustValue($temp[$n]['value']);}}else{$temp2[0] = &XMLRPC_adjustValue($temp['value']);}$temp = $temp2;return $temp;}}function XMLRPC_getMethodName($methodCall){#returns the method namereturn $methodCall['methodCall']['methodName'];}function XMLRPC_request($site, $location, $methodName, $params = NULL, $user_agent = NULL){$site = explode(':', $site);if(isset($site[1]) and is_numeric($site[1])){$port = $site[1];}else{$port = 80;}$site = $site[0];$data['methodCall']['methodName'] = $methodName;$param_count = count($params);if(!$param_count){$data['methodCall']['params'] = NULL;}else{for($n = 0; $n<$param_count; $n++){$data['methodCall']['params']['param'][$n]['value'] = $params[$n];}}$data = XML_serialize($data);if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_request', '<p>Received the following parameter list to send:</p>' . XMLRPC_show($params, 'print_r', true));}$conn = fsockopen ($site, $port); #open the connectionif(!$conn){ #if the connection was not opened successfullyif(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_request', '<p>Connection failed: Couldn't make the connection to $site.</p>');}return array(false, array('faultCode'=>10532, 'faultString'=>'Connection failed: Couldn't make the connection to $site.'));}else{$headers ='POST $location HTTP/1.0rn' .'Host: $sitern' .'Connection: closern' .($user_agent ? 'User-Agent: $user_agentrn' : '') .'Content-Type: text/xmlrn' .'Content-Length: ' . strlen($data) . 'rnrn';fputs($conn, '$headers');fputs($conn, $data);if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_request', '<p>Sent the following request:</p>nn' . XMLRPC_show($headers . $data, 'print_r', true));}#socket_set_blocking ($conn, false);$response = '';while(!feof($conn)){$response .= fgets($conn, 1024);}fclose($conn);#strip headers off of response$data = XML_unserialize(substr($response, strpos($response, 'rnrn')+4));if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_request', '<p>Received the following response:</p>nn' . XMLRPC_show($response, 'print_r', true) . '<p>Which was serialized into the following data:</p>nn' . XMLRPC_show($data, 'print_r', true));}if(isset($data['methodResponse']['fault'])){$return = array(false, XMLRPC_adjustValue($data['methodResponse']['fault']['value']));if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_request', '<p>Returning:</p>nn' . XMLRPC_show($return, 'var_dump', true));}return $return;}else{$return = array(true, XMLRPC_adjustValue($data['methodResponse']['params']['param']['value']));if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_request', '<p>Returning:</p>nn' . XMLRPC_show($return, 'var_dump', true));}return $return;}}}function XMLRPC_response($return_value, $server = NULL){$data['methodResponse']['params']['param']['value'] = $return_value;$return = XML_serialize($data);if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_response', '<p>Received the following data to return:</p>nn' . XMLRPC_show($return_value, 'print_r', true));}header('Connection: close');header('Content-Length: ' . strlen($return));header('Content-Type: text/xml');header('Date: ' . date('r'));if($server){header('Server: $server');}if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_response', '<p>Sent the following response:</p>nn' . XMLRPC_show($return, 'print_r', true));}echo $return;}function XMLRPC_error($faultCode, $faultString, $server = NULL){$array['methodResponse']['fault']['value']['struct']['member'] = array();$temp = $array['methodResponse']['fault']['value']['struct']['member'];$temp[0]['name'] = 'faultCode';$temp[0]['value']['int'] = $faultCode;$temp[1]['name'] = 'faultString';$temp[1]['value']['string'] = $faultString;$return = XML_serialize($array);header('Connection: close');header('Content-Length: ' . strlen($return));header('Content-Type: text/xml');header('Date: ' . date('r'));if($server){header('Server: $server');}if(defined('XMLRPC_DEBUG') and XMLRPC_DEBUG){XMLRPC_debug('XMLRPC_error', '<p>Sent the following error response:</p>nn' . XMLRPC_show($return, 'print_r', true));}echo $return;}function XMLRPC_convert_timestamp_to_iso8601($timestamp){#takes a unix timestamp and converts it to iso8601 required by XMLRPC#an example iso8601 datetime is '20010822T03:14:33'return date('YmdTH:i:s', $timestamp);}function XMLRPC_convert_iso8601_to_timestamp($iso8601){return strtotime($iso8601);}function count_numeric_items($array){return is_array($array) ? count(array_filter(array_keys($array), 'is_numeric')) : 0;}function XMLRPC_debug($function_name, $debug_message){$GLOBALS['XMLRPC_DEBUG_INFO'][] = array($function_name, $debug_message);}function XMLRPC_debug_print(){if($GLOBALS['XMLRPC_DEBUG_INFO']){echo '<table border='1' width='100%'>n';foreach($GLOBALS['XMLRPC_DEBUG_INFO'] as $debug){echo '<tr><th style='vertical-align: top'>$debug[0]</th><td>$debug[1]</td></tr>n';}echo '</table>n';unset($GLOBALS['XMLRPC_DEBUG_INFO']);}else{echo '<p>No debugging information available yet.</p>';}}function XMLRPC_show($data, $func = 'print_r', $return_str = false){ob_start();$func($data);$output = ob_get_contents();ob_end_clean();if($return_str){return '<pre>' . htmlspecialchars($output) . '</pre>n';}else{echo '<pre>', htmlspecialchars($output), '</pre>n';}}?>

服務端程序例子,server.php

<?include 'xml-rpc.inc.php';//定義可被遠程調用的方法$xmlrpc_methods=array();$xmlrpc_methods['insertRecords']='insertRecords';//獲得用戶傳入的方法名和參數$xmlrpc_request = XMLRPC_parse($HTTP_RAW_POST_DATA);$methodName = XMLRPC_getMethodName($xmlrpc_request);$params = XMLRPC_getParams($xmlrpc_request);if (!isset($xmlrpc_methods[$methodName])){XMLRPC_error('1','你所調用的方法不存在');}else {$xmlrpc_methods[$methodName]($params);}function insertRecords($params){if (emptyempty($params)){XMLRPC_error('2','參數出錯');}XMLRPC_response(XMLRPC_prepare('http://www.emtit.com'));}?>

PHP客戶端調用服務端方法例子

<?phpinclude_once 'xml-rpc.inc';$params=array(2,3);$result=XMLRPC_request('127.0.0.1','/services/server.php','insertRecords',$params);//服務端文件放在services文件夾下print_r($result);?>

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
av资源中文在线天堂| 亚洲国产一区二区在线观看 | 麻豆视频一区二区| 免费在线观看一区| 六月婷婷综合| 偷拍亚洲精品| 久久午夜视频| 国产精品欧美三级在线观看| 麻豆成人av在线| 人在线成免费视频| 久久精品官网| 蜜桃一区二区三区在线观看| 日本午夜精品一区二区三区电影 | 日韩午夜av| 黑丝一区二区三区| 国产女优一区| 天堂俺去俺来也www久久婷婷| 蜜桃久久久久久| 免费在线观看精品| 蜜臀av在线播放一区二区三区| 丝瓜av网站精品一区二区| 久久精品一区二区不卡| 日韩欧美不卡| 午夜国产一区二区| 久热精品在线| 在线看片国产福利你懂的| 日本成人中文字幕| 欧美极品中文字幕| 日韩在线看片| 欧美午夜不卡影院在线观看完整版免费| 在线观看免费一区二区| 日韩黄色免费网站| 久热精品在线| 精品国产美女a久久9999| 成人福利视频| 欧美特黄一区| 国产精品yjizz视频网| 久久不射中文字幕| 免费精品视频| 欧美伊人久久| 亚洲精品美女| 91精品日本| 欧美午夜三级| 91精品日本| 欧美资源在线| 国产精品久久久久久久免费观看| 久久精品国产大片免费观看| 亚洲一区二区成人| 91亚洲成人| 国产亚洲一区| 999国产精品视频| 91亚洲一区| 国产乱子精品一区二区在线观看| 麻豆成人在线| 亚洲精品一级二级| 狠狠久久伊人中文字幕| 亚洲中午字幕| 日本一二区不卡| 一本综合精品| 久久精品青草| 久久免费黄色| 亚洲精品在线影院| 青青久久av| 精品中文在线| 麻豆精品蜜桃| 激情综合亚洲| 国产精品毛片在线| 国产欧美日韩一区二区三区四区| 久久只有精品| 麻豆成全视频免费观看在线看| 精品视频亚洲| 日韩不卡一区| 成人在线视频中文字幕| 久久精品国产99国产| 国产亚洲精品美女久久| 在线看片不卡| 日韩精品视频网| 最新亚洲一区| 精品国产乱码久久久久久1区2匹| 精品久久精品| 天堂√8在线中文| 日韩深夜视频| 日韩欧美字幕| 欧美日韩精品免费观看视频完整| 欧美成人综合| 中文字幕免费一区二区| 免费视频一区二区三区在线观看| 欧美激情福利| 日韩影院二区| 黑丝美女一区二区| 少妇精品久久久一区二区三区| 欧美伊人久久| 国产精品一线天粉嫩av| 久热综合在线亚洲精品| 日韩国产精品久久久久久亚洲| 亚洲欧美不卡| 国产欧美日韩影院| 日韩精品不卡一区二区| 国产农村妇女精品一区二区| 国产精品一区二区三区美女| 日韩在线不卡| 亚洲在线一区| 欧美日韩99| 9999国产精品| 一区二区三区国产盗摄| 久久伊人亚洲| 蜜桃av一区二区在线观看| 美女精品久久| 国产欧美成人| 日韩亚洲国产欧美| 国产精品主播| 久久蜜桃av| 日韩精品亚洲aⅴ在线影院| 国产理论在线| 亚洲日韩视频| 激情黄产视频在线免费观看| 日韩一区精品| 波多野结衣一区| 蜜桃精品视频| 亚洲精品乱码日韩| 噜噜噜久久亚洲精品国产品小说| 亚洲成人精品| 亚洲黄色网址| 亚洲一区有码| 丝袜美腿一区| 国产精品日韩精品中文字幕| 激情偷拍久久| 9999国产精品| 精品一区二区三区免费看| 亚洲免费一区三区| 激情综合自拍| 日韩理论片av| 日韩一区二区三区在线看| 国产精品婷婷| 91精品国产调教在线观看| 麻豆国产精品视频| 久久亚洲电影| re久久精品视频| 日韩电影免费网址| 国产一区二区三区成人欧美日韩在线观看 | 美女久久网站| 男女精品网站| 91久久久精品国产| 精品久久影院| 国产福利91精品一区二区| 欧美国产视频| 麻豆精品在线播放| 免费观看亚洲天堂| 国产伦精品一区二区三区视频| 日韩精品欧美成人高清一区二区| 久久免费福利| 成人污污视频| 99tv成人| 综合激情在线| 天海翼精品一区二区三区| 欧美经典一区| 日本不卡一二三区黄网| 日韩动漫一区| 日韩二区在线观看| 日韩av一区二区三区四区| 美日韩一区二区三区| 精品国产乱码| 福利在线免费视频| 亚洲伊人av| 国产视频一区欧美| 日韩中文在线电影| 精品亚洲成人| 国产h片在线观看| 欧美在线亚洲综合一区| 99在线观看免费视频精品观看| 久久久精品网| 在线亚洲自拍| 国产精品国码视频| 精品理论电影在线| 毛片在线网站| 免费精品国产| 综合亚洲色图| 国产精品色在线网站| 女人天堂亚洲aⅴ在线观看| 日本午夜精品| 久久中文字幕一区二区| 97精品一区| 日韩精品一区二区三区av| 久久精品一区二区不卡| 亚洲精品系列| 日韩三级一区| 亚洲午夜视频| 国产精品videossex久久发布| 日韩综合一区| 亚洲天堂日韩在线| 亚洲一区网站| 国产在线欧美| 天堂а√在线最新版中文在线| 日本aⅴ精品一区二区三区 | 久久中文字幕导航| 香蕉久久夜色精品国产| 欧美激情aⅴ一区二区三区| 免费av一区| 日韩久久电影| 国产美女精品视频免费播放软件|