WordPress XMLRPC:Expat报告错误代码5
几个月前,我写了一个小型的PHP应用程序,它使用WordPress XMLRPC库同步两个独立的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`帖子。仅在最近才开始显示此错误。
我试过谷歌搜索错误,没有太大的运气。那么,我的问题是," expat report error code 5"到底是什么意思,谁在生成错误?除此之外,任何其他细节/建议/见解也将受到欢迎!
解决方案
Expat是PHP中的XML解析器。错误代码5是许多错误错误常量之一,在这种情况下为XML_ERROR_UNCLOSED_TOKEN。在我看来,RPC调用返回的结果有错误。我们可能想在file_get_contents
之后和xmlrpc_decode
之后在RPCRequest中进行一些错误检查。
@Novak:谢谢你的建议。问题原来是内存问题。通过从远程位置检索所有帖子,响应超出了PHP允许使用的内存量,因此未封闭的令牌错误。
含糊不清的错误消息的问题是由于使用了过时的XML-RPC库版本。升级WordPress版本后,它为我提供了完整的错误输出,包括内存错误。
我修复了在Apache上安装php-xmlrpc模块的错误
php-xmlrpc.x86_64:用于使用XML-RPC协议的PHP应用程序的模块