ThinkPHP的模板解析函数parseXmlAttrs在阿里云服务器上偶尔会出现BUG。
具体原因是$xml = (array)($xml->tag->attributes());
这一句转换类型失败,导致模板解析返回空。基本上20次会出现一次失败。
解决方案
需要修改TP的两个文件:
1:ThinkPHP/Library/Think/Template/TagLib.class.php 85行
2:ThinkPHP/Library/Think/Template.class.php 274行
修改方法:
通过循环的方式来解析XML
将
改为
修改后的parseXmlAttrs
具体原因是$xml = (array)($xml->tag->attributes());
这一句转换类型失败,导致模板解析返回空。基本上20次会出现一次失败。
解决方案
需要修改TP的两个文件:
1:ThinkPHP/Library/Think/Template/TagLib.class.php 85行
2:ThinkPHP/Library/Think/Template.class.php 274行
修改方法:
通过循环的方式来解析XML
将
$xml = (array)($xml->tag->attributes());
改为
foreach($xml->tag->attributes() as $key=>$value){
$xml_to_list[(string)$key] = (string)$value;
}
修改后的parseXmlAttrs
private function parseXmlAttrs($attrs) {
$xml = '<tpl><tag '.$attrs.' /></tpl>';
$xml = simplexml_load_string($xml);
if(!$xml)
E(L('_XML_TAG_ERROR_'));
// $xml = (array)($xml->tag->attributes());
foreach($xml->tag->attributes() as $key=>$value){
$xml_to_list[(string)$key] = (string)$value;
}
$array = array_change_key_case($xml_to_list);
return $array;
}
public function parseXmlAttr($attr,$tag) {
//XML解析安全过滤
$attr = str_replace('&','___', $attr);
$xml = '<tpl><tag '.$attr.' /></tpl>';
$xml = simplexml_load_string($xml);
if(!$xml) {
E(L('_XML_TAG_ERROR_').' : '.$attr);
}
// $xml = (array)($xml->tag->attributes());
foreach($xml->tag->attributes() as $key=>$value){
$xml_to_list[(string)$key] = (string)$value;
}
if(isset($xml_to_list)){
$array = array_change_key_case($xml_to_list);
if($array) {
$tag = strtolower($tag);
if(!isset($this->tags[$tag])){
// 检测是否存在别名定义
foreach($this->tags as $key=>$val){
if(isset($val['alias']) && in_array($tag,explode(',',$val['alias']))){
$item = $val;
break;
}
}
}else{
$item = $this->tags[$tag];
}
$attrs = explode(',',$item['attr']);
if(isset($item['must'])){
$must = explode(',',$item['must']);
}else{
$must = array();
}
foreach($attrs as $name) {
if( isset($array[$name])) {
$array[$name] = str_replace('___','&',$array[$name]);
}elseif(false !== array_search($name,$must)){
E(L('_PARAM_ERROR_').':'.$name);
}
}
return $array;
}
}else{
return array();
}
}