XMLRPC WordPress:Expat сообщает код ошибки 5
Вопрос
я написал небольшой 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
.