Question

J'ai écrit une petite application PHP il y a plusieurs mois, qui utilise la bibliothèque WordPress XMLRPC pour synchroniser deux blogs WordPress distincts. J'ai un général " RPCRequest " fonction qui empaquette la demande, l’envoie et renvoie la réponse du serveur; j’ai plusieurs fonctions plus spécifiques qui personnalisent le type de demande envoyée.

Dans ce cas particulier, j'appelle " getPostIDs " pour récupérer le nombre de publications sur le serveur distant et leurs identifiants respectifs. Voici le code:

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

Je reçois le message d'erreur suivant:

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: 

Une sorte de cliffhanger qui se termine, ce qui est également étrange. Mais comme le message d'erreur n'est pas formaté en XML, mon intuition est que c'est la bibliothèque XMLRPC locale qui génère l'erreur, pas le serveur distant.

Encore plus étrange, si je modifie le "getPostIDs ()" appel de & get; getPostIDs (1) " ou tout autre nombre entier, cela fonctionne très bien.

Voici le code de la 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));
}

Comme je l’ai dit plus tôt, cela fonctionne bien si vous obtenez "getPostIDs". reçoit un argument entier positif. En outre, cela fonctionnait parfaitement bien tel quel; le paramètre par défaut de 0 indique simplement au serveur RPC qu'il doit récupérer toutes les publications , pas seulement les publications $ num_posts les plus récentes. Ce n'est que récemment que cette erreur a commencé à apparaître.

J'ai essayé de googler l'erreur sans trop de chance. Ma question est donc de savoir exactement ce que "Expat rapporte le code d'erreur 5". moyen et qui génère l’erreur? Tous les détails / suggestions / idées au-delà sont également les bienvenus!

Était-ce utile?

La solution

@Novak: Merci pour votre suggestion. Le problème s'est avéré être un problème de mémoire; en récupérant toutes les publications de l’emplacement distant, la réponse a dépassé la quantité de mémoire que PHP pouvait utiliser, d’où l’erreur de jeton non fermée.

Le problème avec le message d'erreur crypté et incomplet était dû à une version obsolète de la bibliothèque XML-RPC utilisée. Une fois la version de WordPress mise à niveau, elle m'a fourni la sortie d'erreur complète, y compris l'erreur de mémoire.

Autres conseils

J'ai corrigé cette erreur lors de l'installation du module php-xmlrpc sur Apache

php-xmlrpc.x86_64: Un module pour les applications PHP utilisant le protocole XML-RPC

Expat est l’analyseur XML en PHP. Le code d'erreur 5 est l'une des nombreuses constantes d'erreur d'expat, dans ce cas: XML_ERROR_UNCLOSED_TOKEN . Il me semble qu’il ya une erreur dans le résultat renvoyé par l’appel RPC. Vous voudrez peut-être effectuer une vérification d'erreur dans RPCRequest après content_get_get_contents et avant le xmlrpc_decode .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top