私は simpleXML を使用して xml ファイルを解析しており、foreach ループを使用して要素を反復処理し、Yii モデルを使用して mysql データベースに保存したいと考えています。
それぞれ 3 つの属性を持つ 1083 のエントリを含むサンプル xml ファイルがあります。Windows で PHP バージョン 5.3.1 を使用すると、データベース テーブルに 1083 ではなく 1208 のエントリが作成されます。コードで問題を見つけようとしましたが、何時間ものテストの後、Windows で PHP バージョン 5.4.7 に切り替えることにしました。このバージョンでは、正しい 1083 エントリが作成されます。しかし、問題が正確に何であるかを知りたいのです。なぜなら、解決策を見つける必要があるからです。なぜなら、Linux サーバー上の私の生産環境では、間違った数のエントリも作成する PHP バージョン 5.4.15-1 を持っているからです。
これは xml の例です。
<listentries>
<listentry>
<name>downs</name>
<value>-1.5</value>
<type>STATIC</type>
</listentry>
<listentry>
<name>upcoming</name>
<value>1.0</value>
<type>STATIC</type>
</listentry>
...
</listentries>
したがって、私の問題は、 foreach ループが頻繁に繰り返されることです。
$list = simplexml_load_file($filename);
foreach($list->listentries->listentry as $entry){
$model = new Entry;
$model->name = $entry->name;
$model->value = $entry->value;
$model->type = $entry->type;
$model->save();
}
リスト要素の数をエコーすると、1083 になります。繰り返しをカウントするためにカウンターを使用すると、1208 になります。非常に奇妙なことが起こっています。データベースに挿入された 1208 のエントリは、次のようになります。各エントリは少なくとも 1 回挿入されますが、一部は 2 回挿入されます。
不正行為が正確にどこから来ているのか、誰かが考えを持っていますか?
xml ファイルに含まれるエントリが 970 未満の場合、正しい回数の反復が行われることがわかりました。
1083 エントリを含む xml をインポートした後の構成と挿入されたエントリの数:
- Windows、PHP 5.3.1、libxml 2.7.6: 1208 エントリ
- Windows、PHP 5.4.7、libxml 2.7.8: 1083 エントリ
- Linux、PHP 5.4.15-1、libxml 2.7.6: 1208 エントリ
libxml を更新すると役立つようです!?