Вопрос

я написал небольшой PHP приложение несколько месяцев назад, которое использует WordPress XMLRPC library для синхронизации двух отдельных блогов WordPress.У меня есть общая функция «RPCRequest», которая упаковывает запрос, отправляет его и возвращает ответ сервера, а также несколько более конкретных функций, которые настраивают тип отправляемого запроса.

В данном конкретном случае я вызываю getPostIDs, чтобы получить количество сообщений на удаленном сервере и их соответствующие идентификаторы postid.Вот код:

$rpc = new WordRPC('http://mywordpressurl.com/xmlrpc.php', 'username', 'password');
$rpc->getPostIDs();

Я получаю следующее сообщение об ошибке:

expat reports error code 5
description: Invalid document end
line: 1
column: 1
byte index: 0
total bytes: 0

data beginning 0 before byte index: 

Какой-то захватывающий финал, что тоже странно.Но поскольку сообщение об ошибке не форматируется в XML, я интуитивно понимаю, что ошибку генерирует локальная библиотека XMLRPC, а не удаленный сервер.

Еще более странно, если я изменю вызов «getPostIDs()» на «getPostIDs(1)» или любое другое целое число, все будет работать нормально.

Вот код класса WordRPC:

public function __construct($url, $user, $pass) {
  $this->url = $url;
  $this->username = $user;
  $this->password = $pass;

  $id = $this->RPCRequest("blogger.getUserInfo",
                          array("null", $this->username, $this->password));
  $this->blogID = $id['userid'];
}

public function RPCRequest($method, $params) {
  $request = xmlrpc_encode_request($method, $params);
  $context = stream_context_create(array('http' => array(
                    'method' => "POST",
                    'header' => "Content-Type: text/xml",
                    'content' => $request
  )));

  $file = file_get_contents($this->url, false, $context);
  return xmlrpc_decode($file);
}

public function getPostIDs($num_posts = 0) {
  return $this->RPCRequest("mt.getRecentPostTitles",
                            array($this->blogID, $this->username,
                            $this->password, $num_posts));
}

Как я уже упоминал, все работает нормально, если аргументу getPostIDs присвоен положительный целочисленный аргумент.Более того, раньше это работало отлично и так;параметр по умолчанию, равный 0, просто указывает серверу RPC, что он должен получить все посты, а не только самые последние $num_posts посты.Только недавно эта ошибка начала появляться.

Я безуспешно пытался найти ошибку в Google.Мой вопрос тогда в том, что именно означает «код ошибки 5 в отчетах об экспатах» и кто генерирует ошибку? Любые подробности/предложения/идея помимо этого также приветствуются!

Это было полезно?

Решение

@Новак:Спасибо за ваше предложение.Проблема оказалась в памяти;при получении всех сообщений из удаленного местоположения ответ превысил объем памяти, который PHP мог использовать, отсюда и ошибка незакрытого токена.

Проблема с загадочным и неполным сообщением об ошибке возникла из-за использования устаревшей версии библиотеки XML-RPC.Как только я обновил версию WordPress, она предоставила мне полный вывод ошибок, включая ошибку памяти.

Другие советы

я исправил эту ошибку, установив модуль php-xmlrpc на Apache

php-xmlrpc.x86_64:Модуль для PHP-приложений, использующих протокол XML-RPC.

Expat — это парсер XML в PHP.Код ошибки 5 — это одна из многих констант ошибок экспатов, в данном случае: XML_ERROR_UNCLOSED_TOKEN.Мне кажется, что в результате, возвращенном вызовом RPC, есть ошибка.Возможно, вам захочется выполнить проверку ошибок в RPCRequest после file_get_contents и раньше xmlrpc_decode.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top