I'm Ricky -- 个人主页

Talk is Cheap, show me the Code. Talk LESS, Code MORE

PHP 中读 XML 的一个坑

问题

在做一个微信的 PHP 后台时需要读微信服务器 POST 过来的 XML,然后保存到 Memcache 中。

index.php
1
2
3
4
5
6
7
8
9
<?php
public index() {
  $postData = $GLOBALS["HTTP_RAW_POST_DATA"];
  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  $this->cache->memcached->save("openid_".$something, $postObj->FromUserName);
  
  ...
}
?>

怎么也出不来结果,然后发现运行到 save 时有异常,是 Memcache 抛出的,说无法串行化。通过 var_dump 后发现 $postObj->FromUserName 是个 SimepleXMLElement 类型,而用 var_dump $postObj 时发现是 string!!

解决方法

解决方法有多种:

  1. 强制转换为 string
1
2
3
<?php
      $this->cache->memcached->save("openid_".$something, (string)$postObj->FromUserName);
?>
  1. 强制转换为 array
1
2
3
4
5
<?php
      $postData = $GLOBALS["HTTP_RAW_POST_DATA"];;
      $postObj = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
      $this->cache->memcached->save("openid_".$something, $postObj["FromUserName"]);
?>
  1. 转为 stdClass
1
2
3
4
<?php
      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
      $postObj = json_decode(json_encode($postObj));
?>

这个大坑耗去了快两小时!