2012-04-03 3 views
1

PHP 용 Plesk API를 사용하고 싶습니다. Parallels 웹 사이트에서 샘플을 다운로드하고이를 내 웹 사이트에 사용하려고했습니다. 내 웹 사이트에 페이지를 열 때 나는 다음과 같은 오류가 발생합니다 :Plesk api 문자열을 XML로 구문 분석 할 수 없습니다.

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML

코드는 내가 사용 :

<?php 
error_reporting(E_ALL); 
ini_set("display_errors", 1); 
/** 
* Reports error during API RPC request 
*/ 
class ApiRequestException extends Exception {} 

/** 
* Returns DOM object representing request for information about all available domains 
* @return DOMDocument 
*/ 

function domainsInfoRequest() 
{ 
     $xmldoc = new DomDocument('1.0', 'UTF-8'); 
     $xmldoc->formatOutput = true; 

     // <packet> 
     $packet = $xmldoc->createElement('packet'); 
     $packet->setAttribute('version', '1.4.1.2'); 
     $xmldoc->appendChild($packet); 

     // <packet/domain> 
     $domain = $xmldoc->createElement('domain'); 
     $packet->appendChild($domain); 

     // <packet/domain/get> 
     $get = $xmldoc->createElement('get'); 
     $domain->appendChild($get); 

     // <packet/domain/get/filter> 
     $filter = $xmldoc->createElement('filter'); 
     $get->appendChild($filter); 

     // <packet/domain/get/dataset> 
     $dataset = $xmldoc->createElement('dataset'); 
     $get->appendChild($dataset); 

     // dataset elements 
     $dataset->appendChild($xmldoc->createElement('limits')); 
     $dataset->appendChild($xmldoc->createElement('prefs')); 
     $dataset->appendChild($xmldoc->createElement('user')); 
     $dataset->appendChild($xmldoc->createElement('hosting')); 
     $dataset->appendChild($xmldoc->createElement('stat')); 
     $dataset->appendChild($xmldoc->createElement('gen_info')); 

     return $xmldoc; 
} 
/** 
* Prepares CURL to perform Plesk API request 
* @return resource 
*/ 
function curlInit($host, $login, $password) 
{ 
     $curl = curl_init(); 
     curl_setopt($curl, CURLOPT_URL, "https://{$host}:8443/enterprise/control/agent.php"); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl, CURLOPT_POST, true); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
     curl_setopt($curl, CURLOPT_HTTPHEADER, 
      array("HTTP_AUTH_LOGIN: {$login}", 
        "HTTP_AUTH_PASSWD: {$password}", 
        "HTTP_PRETTY_PRINT: TRUE", 
        "Content-Type: text/xml") 
    ); 

     return $curl; 
} 
/** 
* Performs a Plesk API request, returns raw API response text 
* 
* @return string 
* @throws ApiRequestException 
*/ 
function sendRequest($curl, $packet) 
{ 
     curl_setopt($curl, CURLOPT_POSTFIELDS, $packet); 
     $result = curl_exec($curl); 
     if (curl_errno($curl)) { 
      $errmsg = curl_error($curl); 
      $errcode = curl_errno($curl); 
      curl_close($curl); 
      throw new ApiRequestException($errmsg, $errcode); 
     } 
     curl_close($curl); 
     return $result; 
} 

/** 
* Looks if API responded with correct data 
* 
* @return SimpleXMLElement 
* @throws ApiRequestException 
*/ 
function parseResponse($response_string) 
{ 
     $xml = new SimpleXMLElement($response_string); 
     if (!is_a($xml, 'SimpleXMLElement')) 
      throw new ApiRequestException("Can not parse server response: {$response_string}"); 
     return $xml; 
} 
/** 
* Check data in API response 
* @return void 
* @throws ApiRequestException 
*/ 
function checkResponse(SimpleXMLElement $response) 
{ 
     $resultNode = $response->domain->get->result; 

     // check if request was successful 
     if ('error' == (string)$resultNode->status) 
      throw new ApiRequestException("Plesk API returned error: " . (string)$resultNode->result->errtext); 
} 

// 
// int main() 
// 
$host = '************'; 
$login = '************'; 
$password = '************'; 

$curl = curlInit($host, $login, $password); 

try { 

     $response = sendRequest($curl, domainsInfoRequest()->saveXML()); 
     $responseXml = parseResponse($response); 
     checkResponse($responseXml); 

} catch (ApiRequestException $e) { 
     echo $e; 
     die(); 
} 

// Explore the result 
foreach ($responseXml->xpath('/packet/domain/get/result') as $resultNode) { 
     echo "Domain id: " . (string)$resultNode->id . " "; 
     echo (string)$resultNode->data->gen_info->name . " (" . (string)$resultNode->data->gen_info->dns_ip_address . ")\n"; 
} 

?> 

나는 누군가가 해결책을 찾기 위해 나를 도울 수 있기를 바랍니다.

답변

0

스크립트는 내 서버와 완벽하게 작동합니다 (서식을 복원 할 수있는 한). 원래 Parallels 설명서에 제공된 예를 기반으로 한 것 같습니다. 그래서 나는 'Plesk integration guide'의 예를 들고 내 서버에 적용했다.

Plesk 서버를 잘못 구성했다고 가정 할 수 있습니다. 인쇄 XML 요청 (domainsInfoRequest()->saveXML()) 및 XML 응답 ($response) 일 경우 문제를 해결할 수 있습니다. 어떤 이유로 든 $ 응답에는 유효한 XML 코드와 다른 내용이 포함되어 있습니다. 확실하지 않은 경우 복사하여 파일에 붙여 넣고 xmllint (XML 유효성 검사 도구)을 실행하면됩니다.

관련 문제