Pergunta

Eu escrevi uma pequena aplicação PHP há vários meses que usa o WordPress XMLRPC library para sincronizar dois blogs WordPress separadas. Eu tenho uma função geral "RPCRequest" que os pacotes do pedido, envia e retorna a resposta do servidor, e eu tenho várias funções mais específicas que personalizam o tipo de solicitação que é enviada.

Neste caso particular, eu estou chamando "getPostIDs" para recuperar o número de mensagens no servidor remoto e as respectivas postids. Aqui está o código:

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

Estou recebendo a seguinte mensagem de erro:

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: 

Uma espécie de final momento de angústia, que também é estranho. Mas desde que a mensagem de erro não está formatado em XML, a minha intuição é que é a biblioteca XMLRPC local que está gerando o erro, não o servidor remoto.

Ainda mais estranho, se eu mudar os "getPostIDs ()" chamada de "getPostIDs (1)" ou qualquer outro inteiro, ele funciona muito bem.

Aqui está o código para a classe 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));
}

Como eu mencionei, ele funciona bem se "getPostIDs" é dado um argumento inteiro positivo. Além disso, este utilizado para funcionar perfeitamente bem como é; o parâmetro padrão de 0 indica simplesmente ao servidor RPC que ele deve recuperar todas mensagens, não apenas as mensagens $num_posts mais recente. Só recentemente esse erro começou a aparecer.

Eu tentei googling o erro sem muita sorte. A minha pergunta, então, é O que exatamente significa "relatórios de expatriados código de erro 5" média, e que está gerando o erro? Qualquer detalhe / sugestões / idéias para além de que é bem-vindo, também!

Foi útil?

Solução

@Novak: Obrigado por sua sugestão. O problema acabou por ser um problema de memória; recuperando todas as mensagens a partir do local remoto, a resposta excedeu a quantidade de memória PHP foi autorizado a utilizar, daí o erro de token não fechado.

O problema com a mensagem de erro enigmática e incompleta foi devido a uma versão desatualizada da biblioteca XML-RPC sendo usado. Uma vez que eu tinha atualizado a versão do WordPress, ele forneceu-me com a saída de erro completo, incluindo o erro de memória.

Outras dicas

i corrigido este erro ao instalar módulo php-xmlrpc no Apache

php-xmlrpc.x86_64: Um módulo para aplicações PHP que usam o protocolo XML-RPC

Expat é o parser XML em PHP. código de erro 5 é uma das muitas constantes de erro expatriados, neste caso: XML_ERROR_UNCLOSED_TOKEN. Parece-me que há um erro no resultado retornado da chamada RPC. Você pode querer fazer alguma verificação de erros em RPCRequest após file_get_contents e antes xmlrpc_decode.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top