simpleXML无法正确保存XML文件

时间:2011-02-21 04:59:43

标签: php xml simplexml

我写了一个HTTP请求,移动设备将其各自的令牌发送到服务器,如果令牌已经注册,服务器上的此代码将检查XML文件。如果是这样,它什么都不做,如果没有,它会将新标记添加到XML。

保存时(可能是因为有很多人试图同时访问),xml会被截断,如下所示:

  

<根>   <令牌GT; 123456< / token>   <令牌GT; 234567< / token>   <令牌GT; 345678< /到

会发生什么?

代码是这样的:

    if( !ini_get('safe_mode') ){
        set_time_limit(0);
    } 

    if (file_exists("tokens.xml")) 
    {
        $xml = simplexml_load_file("tokens.xml");       

        if ($xml)
        {
            $found = false;

            foreach($xml->children() as $child)
            {
                if ($_POST['token'] == $child) 
                {
                    $found = true;
                    break;
                }
            }
            if ($found)
                echo $_POST['token'];
            else
            {
                $xml->addChild("token", $_POST['token']);
                unlink("tokens.xml");
                $xml->saveXML("tokens.xml");
                echo $_POST['token'];
            }
        }
        else
            echo "Error";

    }

1 个答案:

答案 0 :(得分:1)

奇怪的错误。也许是竞争条件,在这种情况下你应该研究flock()。实际上,您需要做的是flock()一个用作全局锁的虚拟文件,在临时名称下写入新文件,然后将文件重命名为“tokens.xml”。所以基本上你实现自己的并发控制......这绝不是一个好兆头。

理想情况下,您应该使用数据库。

在侧节点上,file_put_contents()应该是原子IIRC。我不知道SimpleXMLElement::asXML()是不是。