【问题标题】:Plesk api String could not be parsed as XMLPlesk api 字符串无法解析为 XML
【发布时间】:2012-04-03 12:13:20
【问题描述】:

我想为 PHP 使用 Plesk Api。我从 Parallels 网站下载了一个示例,并尝试将其用于我的网站。当我在我的网站上打开页面时,出现以下错误:

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";
}

?>

希望有人能帮我找到解决办法。

【问题讨论】:

    标签: php xml api curl plesk


    【解决方案1】:

    您的脚本与我的服务器完美配合(尽可能恢复格式)。 它似乎基于原始 Parallels 文档中提供的示例。因此,我从 `Plesk integration guide 中获取了一个示例并将其应用于我的服务器 - 它也可以正常工作。

    我可以假设您的 Plesk 服务器配置有误。如果您的打印 XML 请求 (domainsInfoRequest()-&gt;saveXML()) 和 XML 响应 ($response),也许您可​​以对其进行故障排除。由于某种原因,您的 $response 显然包含与有效 XML 代码不同的内容。如果不确定,您可以将其复制/粘贴到文件中并在其上运行xmllint(XML 验证工具)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2017-02-05
      • 2023-03-22
      相关资源
      最近更新 更多