我有一个xml文件,格式如下 -
<?xml version="1.0"?>
<db>
<count></count>
<uid></uid>
<score></score>
</db>
我在我的xml文件中添加了数千个项目。
我在php中使用simplexml来解析我的xml。我正在打开像这样的xml文件 -
$result= new SimpleXMLElement($file, null, true);
然后关闭它 -
file_put_contents($file, $data->asXML());
当我在本地服务器上运行时,一切都运行正常,但是当我在我的服务器上在线上传时,它可以正常运行一段时间,一段时间后,这会附加在我的xml文件的末尾
<?xml version="1.0"?>
<db>
<count></count>
<uid></uid>
<score></score>
</db>
/score></db>
我收到解析错误 -
在xml文件末尾附加了不需要的数据
我很困惑有什么不对,因为它在我的本地服务器上工作得非常好。这是我的代码错误还是服务器的错误?
修改 计数,uid和分数是预先填充的。我只是更新分数。 以下是更新评分部分的代码 -
$data= new SimpleXMLElement($file, null, true);
$winner=intval($data->score[$winid]);
$loser=intval($data->score[$loseid]);
$exp_winner=expected($loser,$winner);
$new_win=win($winner,$exp_winner);
$exp_loser=expected($winner,$loser);
$new_lose=loss($loser,$exp_loser);
$data->score[$winid]=$new_win;
$data->score[$loseid]==$new_lose;
file_put_contents($file, $data->asXML());
答案 0 :(得分:1)
虽然在the manual page上没有明确说明,但似乎file_put_contents
的默认行为是而不是来锁定正在写入的文件。这可能意味着两个PHP进程都试图同时覆盖该文件,这可能是您损坏的原因。
要消除这种可能性,您可以将LOCK_EX
标记作为第三个参数传递,即file_put_contents($file, $data->asXML(), LOCK_EX);
(我不确定如何测试这个假设,因为它似乎是你遇到的罕见的竞争条件......)