0

次の形式のxmlファイルがあります-

<?xml version="1.0"?>
<db>
<count></count>
<uid></uid>
<score></score>
</db>

xml ファイルに何千もの項目を追加しています。

私はxmlを解析するためにphpでsimplexmlを使用しています。私はこのような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、書き込まれているファイルをロックしないようです。これは、2つのPHPプロセスが両方とも同時にファイルを上書きしようとすることを意味する可能性があり、これが破損の原因である可能性があります。

この可能性を排除するために、LOCK_EXフラグを3番目のパラメーターとして渡すことができます。file_put_contents($file, $data->asXML(), LOCK_EX);

(この仮説をテストする方法がわかりません。これは、発生しているまれな競合状態である可能性が高いためです...)

于 2013-03-02T19:40:53.337 に答える