ไลบรารี XML-RPC ที่พบในอินเทอร์เน็ตมีประโยชน์มากสำหรับการพัฒนาอินเทอร์เฟซการสื่อสารภายนอกขนาดเล็ก บันทึกโค้ดนี้เป็น xml-rpc.inc.php
<?php
-
ไลบรารี XML-RPC ที่พบในอินเทอร์เน็ตมีประโยชน์มากสำหรับการพัฒนาอินเทอร์เฟซการสื่อสารภายนอกขนาดเล็ก
-
ฟังก์ชั่น & XML_serialize($data, $level = 0, $prior_key = NULL){
#ถือว่าแฮช คีย์คือชื่อตัวแปร
$xml_serialized_string = "";
ในขณะที่(รายการ($key, $value) = แต่ละ($data)){
$อินไลน์ = เท็จ;
$numeric_array = เท็จ;
$แอตทริบิวต์ = "";
#echo "คีย์ปัจจุบันของฉันคือ '$key' ถูกเรียกพร้อมกับคีย์ก่อนหน้า '$prior_key'<br>";
if(!strstr($key, " attr")){ #ถ้าไม่ใช่แอตทริบิวต์
if(array_key_exists("$key attr", $data)){
ในขณะที่(รายการ($attr_name, $attr_value) = แต่ละ($data["$key attr"])){
#echo "พบแอตทริบิวต์ $attribute_name ที่มีค่า $attribute_value<br>";
$attr_value = &htmlอักขระพิเศษ($attr_value, ENT_QUOTES);
$attributes .= " $attr_name="$attr_value"";
-
-
ถ้า(is_numeric($key)){
#echo "คีย์ปัจจุบันของฉัน ($key) เป็นตัวเลข คีย์หลักของฉันคือ '$prior_key'<br>";
$คีย์ = $prior_key;
}อื่น{
#คุณไม่สามารถมีปุ่มตัวเลขสองระดับติดต่อกันได้ เท่านี้ก็โอเค
#echo "กำลังตรวจสอบว่ามีคีย์ตัวเลขอยู่ในข้อมูลหรือไม่";
if(is_array($value) และ array_key_exists(0, $value)){
# echo "ใช่แล้ว! เรียกตัวเองว่าเป็นผลจากอาร์เรย์ตัวเลข<br>";
$numeric_array = จริง;
$xml_serialized_string .= XML_serialize($value, $level, $key);
-
#echo "<br>";
-
ถ้า(!$numeric_array){
$xml_serialized_string .= str_repeat("t", $level) . "<$key$attributes>";
ถ้า(is_array($มูลค่า)){
$xml_serialized_string .= "rn" . XML_serialize($value, $ระดับ+1);
}อื่น{
$อินไลน์ = จริง;
$xml_serialized_string .= htmlอักขระพิเศษ($value);
-
$xml_serialized_string .= (!$inline ? str_repeat("t", $level) : "") . "</$key>rn";
-
}อื่น{
#echo "ข้ามบันทึกแอตทริบิวต์สำหรับคีย์ $key<bR>";
-
-
ถ้า($ระดับ == 0){
$xml_serialized_string = "<?xml version="1.0" ?>rn" .
ส่งคืน $xml_serialized_string;
}อื่น{
ส่งคืน $xml_serialized_string;
-
-
คลาส XML {
var $parser; #a อ้างอิงถึงตัวแยกวิเคราะห์ XML
var $document; #the โครงสร้าง XML ทั้งหมดที่สร้างขึ้นจนถึงตอนนี้
var $current; #a ตัวชี้ไปยังรายการปัจจุบัน - นี่คืออะไร
var $parent; #a ตัวชี้ไปยังพาเรนต์ปัจจุบัน - พาเรนต์จะเป็นอาร์เรย์
var $parents; #an อาร์เรย์ของพาเรนต์ล่าสุดในแต่ละระดับ
var $last_opened_tag;
ฟังก์ชั่น XML($data=null){
$นี่->ตัวแยกวิเคราะห์ = xml_parser_create();
xml_parser_set_option ($นี่->ตัวแยกวิเคราะห์, XML_OPTION_CASE_FOLDING, 0);
xml_set_object($this->ตัวแยกวิเคราะห์, $this);
xml_set_element_handler($this->ตัวแยกวิเคราะห์, "เปิด", "ปิด");
xml_set_Character_data_handler($this->ตัวแยกวิเคราะห์, "data");
# register_shutdown_function(array($this, 'destruct'));
-
ฟังก์ชั่นทำลายล้าง(){
xml_parser_free($this->ตัวแยกวิเคราะห์);
-
ฟังก์ชั่นแยกวิเคราะห์($ข้อมูล){
$นี่->เอกสาร = array();
$this->parent = $this->เอกสาร;
$นี่->พาเรนต์ = อาร์เรย์();
$นี่->last_opened_tag = โมฆะ;
xml_parse($this->parser, $data);
ส่งคืนเอกสาร $this->;
-
ฟังก์ชั่นเปิด($parser, $tag, $attributes){
#echo "แท็กเปิด $tag<br>n";
$นี่->ข้อมูล = "";
$this->last_opened_tag = $tag; #tag คือสตริง
ถ้า(array_key_exists($tag, $this->parent)){
#echo "มีอินสแตนซ์ของ '$tag' อยู่แล้วที่ระดับปัจจุบัน ($level)<br>n";
if(is_array($this->parent[$tag]) and array_key_exists(0, $this->parent[$tag])){ #ถ้าคีย์เป็นตัวเลข
#need เพื่อให้แน่ใจว่าเป็นตัวเลข (บัญชีสำหรับแอตทริบิวต์)
$key = count_numeric_items($this->parent[$tag]);
#echo "มี $key กรณี: คีย์เป็นตัวเลข<br>n";
}อื่น{
#echo "มีเพียงตัวอย่างเดียวเท่านั้น ย้ายทุกอย่างไปรอบๆ<br>n";
$temp = $this->parent[$tag];
unset($this->parent[$tag]);
$this->parent[$tag][0] = $temp;
if(array_key_exists("$tag attr", $this->parent)){
#shift คุณลักษณะไปรอบๆ ด้วยหากมีอยู่
$temp = $this->parent["$tag attr"];
unset($this->parent["$tag attr"]);
$this->parent[$tag]["0 attr"] = $temp;
-
$คีย์ = 1;
-
$this->parent = $this->parent[$tag];
}อื่น{
$key = $แท็ก;
-
ถ้า($แอตทริบิวต์){
$this->parent["$key attr"] = $attributes;
-
$this->parent[$key] = array();
$this->parent = $this->parent[$key];
array_unshift($this->พาเรนต์, $this->พาเรนต์);
-
ข้อมูลฟังก์ชัน($parser, $data){
#echo "ข้อมูลคือ '", htmlspecialchars($data), "'<br>n";
ถ้า($this->last_opened_tag != NULL){
$นี่->ข้อมูล .= $data;
-
-
ฟังก์ชั่นปิด($parser, $tag){
#echo "ปิดแท็ก $tag<br>n";
ถ้า($this->last_opened_tag == $tag){
$this->parent = $this->ข้อมูล;
$นี่->last_opened_tag = โมฆะ;
-
array_shift($นี่->พาเรนต์);
$this->parent = $this->parents[0];
-
-
ฟังก์ชั่น & XML_unserialize($xml){
$xml_parser = XML ใหม่();
$data = $xml_parser->แยกวิเคราะห์($xml);
$xml_parser->ทำลาย();
ส่งคืนข้อมูล $;
-
ฟังก์ชัน & XMLRPC_parse($คำขอ){
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_parse', "<p>ได้รับคำขอดิบต่อไปนี้:</p>" . XMLRPC_show($request, 'print_r', true));
-
$data = &XML_unserialize($คำขอ);
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_parse', "<p>การส่งคืนคำขอแยกวิเคราะห์ต่อไปนี้:</p>" . XMLRPC_show($data, 'print_r', true));
-
ส่งคืนข้อมูล $;
-
ฟังก์ชั่น & XMLRPC_prepare($data, $type = NULL){
ถ้า(is_array($ข้อมูล)){
$num_elements = จำนวน($ข้อมูล);
if((array_key_exists(0, $data) or !$num_elements) และ $type != 'struct'){ #มันเป็นอาร์เรย์
if(!$num_elements){ #ถ้าอาร์เรย์ว่างเปล่า
$returnvalue = array('array' => array('data' => NULL));
}อื่น{
$returnvalue['array']['data']['value'] = array();
$temp = $returnvalue['array']['data']['value'];
$count = count_numeric_items($ข้อมูล);
สำหรับ($n=0; $n<$count; $n++){
$ประเภท = โมฆะ;
if(array_key_exists("$n ประเภท", $data)){
$type = $data["$n ประเภท"];
-
$temp[$n] = XMLRPC_prepare($data[$n], $type);
-
-
}else{ #มันคือโครงสร้าง
if(!$num_elements){ #ถ้าโครงสร้างว่างเปล่า
$returnvalue = array('struct' => NULL);
}อื่น{
$returnvalue['struct']['member'] = array();
$temp = $returnvalue['struct']['สมาชิก'];
ในขณะที่(รายการ($key, $value) = แต่ละ($data)){
if(substr($key, -5) != ' type'){ #ถ้าไม่ใช่ตัวระบุประเภท
$ประเภท = โมฆะ;
if(array_key_exists("$ประเภทคีย์", $data)){
$type = $data["$ประเภทคีย์"];
-
$temp[] = array('name' => $key, 'value' => XMLRPC_prepare($value, $type));
-
-
-
-
}else{ #มันคือสเกลาร์
ถ้า(!$ประเภท){
ถ้า(is_int($ข้อมูล)){
$returnvalue['int'] = $data;
ส่งกลับค่าส่งคืน;
}elseif(is_float($ข้อมูล)){
$returnvalue['double'] = $data;
ส่งกลับค่าส่งคืน;
}elseif(is_bool($ข้อมูล)){
$returnvalue['boolean'] = ($data ? 1 : 0);
ส่งกลับค่าส่งคืน;
}elseif(preg_match('/^d{8}Td{2}:d{2}:d{2}$/', $data, $matches)){ #เป็นวันที่
$returnvalue['dateTime.iso8601'] = $data;
ส่งกลับค่าส่งคืน;
}elseif(is_string($ข้อมูล)){
$returnvalue['string'] = htmlspecialchars($data);
ส่งกลับค่าส่งคืน;
-
}อื่น{
$returnvalue[$type] = htmlspecialchars($data);
-
-
ส่งกลับค่าส่งคืน;
-
ฟังก์ชั่น & XMLRPC_adjustValue($current_node){
ถ้า(is_array($current_node)){
ถ้า(isset($current_node['array'])){
if(!is_array($current_node['array']['data'])){
#หากไม่มีองค์ประกอบ ให้ส่งคืนอาร์เรย์ว่าง
กลับอาร์เรย์();
}อื่น{
#echo "กำจัดอาร์เรย์ -> ข้อมูล -> ค่า<br>n";
$temp = $current_node['array']['data']['value'];
if(is_array($temp) และ array_key_exists(0, $temp)){
$count = นับ($ชั่วคราว);
สำหรับ($n=0;$n<$count;$n++){
$temp2[$n] = &XMLRPC_adjustValue($temp[$n]);
-
$temp = $temp2;
}อื่น{
$temp2 = &XMLRPC_adjustValue($temp);
$temp = อาร์เรย์($temp2);
#ฉันทำมอบหมายงานชั่วคราวเพราะหลีกเลี่ยงการคัดลอก
# เนื่องจากฉันสามารถใส่ข้อมูลอ้างอิงในอาร์เรย์ได้
โมเดลอ้างอิงของ #PHP นั้นค่อนข้างงี่เง่า และฉันไม่สามารถพูดได้:
# $temp = array(&XMLRPC_adjustValue($temp));
-
-
}elseif(isset($current_node['struct'])){
if(!is_array($current_node['struct'])){
#หากไม่มีสมาชิก ให้ส่งคืนอาร์เรย์ว่าง
กลับอาร์เรย์();
}อื่น{
#echo "กำลังกำจัด struct -> สมาชิก<br>n";
$temp = $current_node['struct']['สมาชิก'];
if(is_array($temp) และ array_key_exists(0, $temp)){
$count = นับ($ชั่วคราว);
สำหรับ($n=0;$n<$count;$n++){
#echo "ส่งชื่อ {$temp[$n][name]}. Value คือ: " . show($temp[$n][value], var_dump, true) .
$temp2[$temp[$n]['name']] = &XMLRPC_adjustValue($temp[$n]['value']);
#echo "adjustValue(): หลังจากกำหนด ค่าจะเป็น " . show($temp2[$temp[$n]['name']], var_dump, true) "<br>n";
-
}อื่น{
#echo "ส่งชื่อ $temp[name]<br>n";
$temp2[$temp['name']] = &XMLRPC_adjustValue($temp['value']);
-
$temp = $temp2;
-
}อื่น{
$types = array('string', 'int', 'i4', 'double', 'dateTime.iso8601', 'base64', 'บูลีน');
$fell_through = จริง;
foreach($ประเภทเป็น $ประเภท){
ถ้า(array_key_exists($type, $current_node)){
#echo "กำลังกำจัด '$type'<br>n";
$temp = $current_node[$type];
#echo "adjustValue(): โหนดปัจจุบันถูกตั้งค่าด้วยประเภท $type<br>n";
$fell_through = เท็จ;
หยุดพัก;
-
-
ถ้า($ตกผ่าน){
$type = 'สตริง';
#echo "ล้มเหลว! ประเภทคือ $type<br>n";
-
สวิตช์ ($ ประเภท) {
กรณี 'int': กรณี 'i4': $temp = (int)$temp;
กรณี 'สตริง': $temp = (สตริง)$temp;
กรณี 'สองเท่า': $temp = (สองเท่า)$temp;
กรณี 'บูลีน': $temp = (บูล)$temp;
-
-
}อื่น{
$temp = (สตริง)$current_node;
-
กลับ $temp;
-
ฟังก์ชัน XMLRPC_getParams($ คำขอ){
if(!is_array($request['methodCall']['params'])){
#หากไม่มีพารามิเตอร์ ให้ส่งคืนอาร์เรย์ว่าง
กลับอาร์เรย์();
}อื่น{
#echo "กำจัด methodCall -> params -> param<br>n";
$temp = $request['methodCall']['params']['param'];
if(is_array($temp) และ array_key_exists(0, $temp)){
$count = นับ($ชั่วคราว);
สำหรับ($n = 0; $n < $count; $n++){
#echo "พารามิเตอร์การทำให้เป็นอนุกรม $n<br>";
$temp2[$n] = &XMLRPC_adjustValue($temp[$n]['value']);
-
}อื่น{
$temp2[0] = &XMLRPC_adjustValue($temp['value']);
-
$temp = $temp2;
กลับ $temp;
-
-
ฟังก์ชัน XMLRPC_getMethodName($methodCall){
#ส่งคืนชื่อวิธีการ
กลับ $methodCall['methodCall']['methodName'];
-
ฟังก์ชัน XMLRPC_request($site, $location, $methodName, $params = NULL, $user_agent = NULL){
$site = explode(':', $site);
if(isset($site[1]) และ is_numeric($site[1])){
$พอร์ต = $ไซต์[1];
}อื่น{
$ พอร์ต = 80;
-
$ไซต์ = $ไซต์[0];
$data["methodCall"]["methodName"] = $methodName;
$param_count = จำนวน($พารามิเตอร์);
ถ้า(!$param_count){
$data["methodCall"]["params"] = NULL;
}อื่น{
สำหรับ($n = 0; $n<$param_count; $n++){
$data["methodCall"]["params"]["param"][$n]["value"] = $params[$n];
-
-
$data = XML_serialize($ข้อมูล);
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_request', "<p>ได้รับรายการพารามิเตอร์ต่อไปนี้ที่จะส่ง:</p>" . XMLRPC_show($params, 'print_r', true));
-
$conn = fsockopen ($ไซต์, $พอร์ต); #เปิดการเชื่อมต่อ
if(!$conn){ #ถ้าไม่สามารถเปิดการเชื่อมต่อได้สำเร็จ
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_request', "<p>การเชื่อมต่อล้มเหลว: ไม่สามารถเชื่อมต่อกับ $site.</p>");
-
return array(false, array('faultCode'=>10532, 'faultString'=>"การเชื่อมต่อล้มเหลว: ไม่สามารถเชื่อมต่อกับ $site."));
}อื่น{
$เฮดเดอร์ =
"โพสต์ $location HTTP/1.0rn"
"โฮสต์: $sitern"
"การเชื่อมต่อ: ปิดrn"
($user_agent ? "ผู้ใช้-ตัวแทน: $user_agentrn" : '')
"ประเภทเนื้อหา: text/xmlrn"
"ความยาวเนื้อหา: " . strlen($data) "rnrn";
fputs($conn, "$ส่วนหัว");
fputs($conn, $data);
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_request', "<p>ส่งคำขอต่อไปนี้:</p>nn" . XMLRPC_show($headers . $data, 'print_r', true));
-
#socket_set_blocking ($conn, เท็จ);
$ตอบกลับ = "";
ในขณะที่(!feof($conn)){
$ตอบกลับ .= fgets($conn, 1,024);
-
fclose($conn);
#ตัดส่วนหัวออกจากการตอบกลับ
$data = XML_unserialize(substr($response, strpos($response, "rnrn")+4));
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_request', "<p>Received the following response:</p>nn" . XMLRPC_show($response, 'print_r', true) . "<p>ซึ่งถูกทำให้เป็นอนุกรมเป็นข้อมูลต่อไปนี้:< /p>nn" . XMLRPC_show($data, 'print_r', true));
-
if(isset($data['methodResponse']['fault'])){
$return = array(false, XMLRPC_adjustValue($data['methodResponse']['fault']['value']));
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_request', "<p>การส่งคืน:</p>nn" . XMLRPC_show($return, 'var_dump', true));
-
ส่งคืน $ ส่งคืน;
}อื่น{
$return = array(true, XMLRPC_adjustValue($data['methodResponse']['params']['param']['value']));
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_request', "<p>การส่งคืน:</p>nn" . XMLRPC_show($return, 'var_dump', true));
-
ส่งคืน $ ส่งคืน;
-
-
-
ฟังก์ชัน XMLRPC_response($return_value, $server = NULL){
$data["methodResponse"]["params"]["param"]["value"] = $return_value;
$return = XML_serialize($ข้อมูล);
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_response', "<p>ได้รับข้อมูลต่อไปนี้เพื่อส่งคืน:</p>nn" . XMLRPC_show($return_value, 'print_r', true));
-
header("การเชื่อมต่อ: ปิด");
header("ความยาวเนื้อหา: " .strlen($return));
header("ประเภทเนื้อหา: text/xml");
header("วันที่: " .date("r");
ถ้า($เซิร์ฟเวอร์){
ส่วนหัว("เซิร์ฟเวอร์: $เซิร์ฟเวอร์");
-
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_response', "<p>ส่งการตอบกลับต่อไปนี้:</p>nn" . XMLRPC_show($return, 'print_r', true));
-
สะท้อนกลับ $;
-
ฟังก์ชัน XMLRPC_error($faultCode, $faultString, $server = NULL){
$array["methodResponse"]["fault"]["value"]["struct"]["member"] = array();
$temp = $array["methodResponse"]["fault"]["value"]["struct"]["member"];
$temp[0]["name"] = "รหัสข้อผิดพลาด";
$temp[0]["value"]["int"] = $faultCode;
$temp[1]["name"] = "faultString";
$temp[1]["value"]["string"] = $faultString;
$return = XML_serialize($อาร์เรย์);
header("การเชื่อมต่อ: ปิด");
header("ความยาวเนื้อหา: " .strlen($return));
header("ประเภทเนื้อหา: text/xml");
header("วันที่: " .date("r");
ถ้า($เซิร์ฟเวอร์){
ส่วนหัว("เซิร์ฟเวอร์: $เซิร์ฟเวอร์");
-
ถ้า (กำหนด ('XMLRPC_DEBUG') และ XMLRPC_DEBUG){
XMLRPC_debug('XMLRPC_error', "<p>ส่งการตอบกลับข้อผิดพลาดต่อไปนี้:</p>nn" . XMLRPC_show($return, 'print_r', true));
-
สะท้อนกลับ $;
-
ฟังก์ชัน XMLRPC_convert_timestamp_to_iso8601($timestamp){
#ใช้การประทับเวลายูนิกซ์และแปลงเป็น iso8601 ที่ XMLRPC ต้องการ
#an ตัวอย่าง iso8601 datetime คือ "20010822T03:14:33"
วันที่กลับ("YmdTH:i:s", $timestamp);
-
ฟังก์ชัน XMLRPC_convert_iso8601_to_timestamp($iso8601){
กลับ strtotime($iso8601);
-
ฟังก์ชั่น count_numeric_items($array){
return is_array($array) ? count(array_filter(array_keys($array), 'is_numeric')) : 0;
-
ฟังก์ชัน XMLRPC_debug($function_name, $debug_message){
$GLOBALS['XMLRPC_DEBUG_INFO'][] = array($function_name, $debug_message);
-
ฟังก์ชัน XMLRPC_debug_print(){
ถ้า($GLOBALS['XMLRPC_DEBUG_INFO']){
echo "<table border="1" width="100%">n";
foreach($GLOBALS['XMLRPC_DEBUG_INFO'] เป็น $debug){
echo "<tr><th style="vertical-align: top">$debug[0]</th><td>$debug[1]</td></tr>n";
-
เสียงสะท้อน "</table>n";
unset($GLOBALS['XMLRPC_DEBUG_INFO']);
}อื่น{
echo "<p>ยังไม่มีข้อมูลการแก้ไขข้อบกพร่อง</p>";
-
-
ฟังก์ชัน XMLRPC_show($data, $func = "print_r", $return_str = false){
ob_start();
$func($ข้อมูล);
$output = ob_get_contents();
ob_end_clean();
ถ้า($return_str){
กลับ "<pre>" . htmlspecialchars($output) "</pre>n";
}อื่น{
echo "<pre>", htmlspecialchars($output), "</pre>n";
-
-
?>
ตัวอย่างโปรแกรมเซิร์ฟเวอร์ server.php
<?
รวม '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);
ถ้า (!isset($xmlrpc_methods[$methodName])){
XMLRPC_error('1',"วิธีการที่คุณเรียกไม่มีอยู่");
}อื่น {
$xmlrpc_methods[$methodName]($params);
-
ฟังก์ชั่น insertRecords($params){
ถ้า (ว่างเปล่า($params)){
XMLRPC_error('2',"ข้อผิดพลาดของพารามิเตอร์");
-
XMLRPC_response(XMLRPC_prepare('http://www.emtit.com'));
-
?>
ตัวอย่างวิธีการเรียกเซิร์ฟเวอร์ไคลเอนต์ PHP
<?php
include_once 'xml-rpc.inc';
$params=อาร์เรย์(2,3);
$result=XMLRPC_request("127.0.0.1","/services/server.php"insertRecords",$params);//ไฟล์เซิร์ฟเวอร์ถูกวางไว้ในโฟลเดอร์บริการ
print_r($ผลลัพธ์);
-