我写了一个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";
}
答案 0 :(得分:1)
奇怪的错误。也许是竞争条件,在这种情况下你应该研究flock()
。实际上,您需要做的是flock()
一个用作全局锁的虚拟文件,在临时名称下写入新文件,然后将文件重命名为“tokens.xml”。所以基本上你实现自己的并发控制......这绝不是一个好兆头。
理想情况下,您应该使用数据库。
在侧节点上,file_put_contents()
应该是原子IIRC。我不知道SimpleXMLElement::asXML()
是不是。