0

我有一个具有以下格式的 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());
4

1 回答 1

1

尽管在手册页上没有明确说明,但似乎默认行为file_put_contents锁定正在写入的文件。这可能意味着两个 PHP 进程都试图同时覆盖文件,这可能是您损坏的原因。

为了消除这种可能性,您可以将LOCK_EX标志作为第三个参数传递,即file_put_contents($file, $data->asXML(), LOCK_EX);

(我不确定如何检验这个假设,因为这似乎是您遇到的一种罕见的竞争条件......)

于 2013-03-02T19:40:53.337 回答