Есть большой xml файл весом 9Mb с 9000 товаров. Был написан скрипт парсинга такого файла с помощью SimpleXML. Скрипт должен запускаться по крону
2 раза в неделю. На одном хостинге скрипт работал, но приходили письма о том, что на сайте происходят процессы, кот нагружают сервер.
На другом хостинге скрипт перестал работать и когда его запускаешь вручную, то пишет Ошибка 504 Gateway Time-out.
Я решили переписать скрипт, использовав для парсинга другой метод - SAX парсер, т.к. прочитала, что SimpleXML сильно нагружает память.
В приложении структура xml и мой скрипт SAX парсера. При написании скрипта я просмотрела примеры и не нашла, как достать информацию
из более глубокого уровня вложенности - например, из rubriky или pics.Подскажите, пожалуйста, как это можно сделать. И еще: Для каждого товара вызываются функции addArticle, updateArticle и другие,
кот заносят в БД информацию о текущем товаре. Это правильный подход, что кажд товар по отдельности записывается сразу в БД или может быть
нужно прочитать файл, сформировать,например, массив из данных и потом делать запись в БД?
<?xml version="1.0" encoding="windows-1251"?>
<root>
<item>
<artikul>10004900</artikul>
<name>Женские дух L'atour</name>
<rubriky>
<rubr>Каталог для женщин\Духи\Французские духи\</rubr>
</rubriky>
<color>синий</color>
<vid>цветная коробка</vid>
<ves>0.216</ves>
<kol>1</kol>
<opis></opis>
<price>667.3</price>
<pics>
<small>
<pic>10004900_a.jpg</pic>
<pic>10004900_b.jpg</pic>
</small>
<big>
<pic>10004900_d.jpg</pic>
<pic>10004900_e.jpg</pic>
</big>
</pics>
<ostatok>0</ostatok>
<razmer>d85х245 мм</razmer>
<brand>L'atour</brand>
<material>пластик</material>
</item>
<item>
<artikul>10004900</artikul>
<name>Женские дух L'atour</name>
<rubiky>
<rubr>Каталог для женщин\Духи\Французские духи\</rubr>
</rubriky>
<color>синий</color>
<vid>цветная коробка</vid>
<ves>0.216</ves>
<kol>1</kol>
<opis></opis>
<price>667.3</price>
<pics>
<small>
<pic>10004900_a.jpg</pic>
<pic>10004900_b.jpg</pic>
</small>
<big>
<pic>10004900_d.jpg</pic>
<pic>10004900_e.jpg</pic>
</big>
</pics>
<ostatok>0</ostatok>
<razmer>d85х245 мм</razmer>
<brand>L'atour</brand>
<material>пластик</material>
</item>
<item>
<artikul>10004900</artikul>
<name>Женские дух L'atour</name>
<rubiky>
<rubr>Каталог для женщин\Духи\Французские духи\</rubr>
</rubriky>
<color>синий</color>
<vid>цветная коробка</vid>
<ves>0.216</ves>
<kol>1</kol>
<opis></opis>
<price>667.3</price>
<pics>
<small>
<pic>10004900_a.jpg</pic>
<pic>10004900_b.jpg</pic>
</small>
<big>
<pic>10004900_d.jpg</pic>
<pic>10004900_e.jpg</pic>
</big>
</pics>
<ostatok>0</ostatok>
<razmer>d85х245 мм</razmer>
<brand>L'atour</brand>
<material>пластик</material>
</item>
</root>
<?/* --------------------Чтение XML файла------------------------- */
$local_file = $_SERVER['DOCUMENT_ROOT']."/local.xml";
$conn=db_connect();
$insideitem=false;
$tag='';
$criterias=array();
$Artikul='';
$Name='';
$i=0;
$criteriasIds=getCriteriasIds($conn);
function startElement($parser,$name,$attrs){
global $insideitem,$tag,$criterias,$Artikul,$Name,$Price,$i,$conn,$criteriasIds;
if($insideitem){
$tag=$name;
}
elseif($name=="ITEM"){
$insideitem = true;
}
}
function endElement ($parser,$name){
global $insideitem,$tag,$criterias,$Artikul,$Name,$Price,$i,$conn,$criteriasIds;
if($name=="ITEM"){
$i++;
echo $i.' ';
echo $insideitem;
echo $tag;
print_r($criterias);
echo $Artikul;
echo $Name;
echo $ShortDescription;
echo $Price;
$categoryID=10;
/*обновляем параметры товара по артикулу, предполагая что такой товар уже есть.*/
$check_update=updateArticle($Artikul,$Name,$categoryID,$Price,$conn);
/*если update не выполнился, значит такого товара нет - нужно его добавить.*/
if ($check_update==false){
$article_id=addArticle($Artikul,$Name,$categoryID,$Price,$conn);
addCriteriasValues($article_id,$criterias,$criteriasIds,$conn);
}
else{
$article_id = $check_update;
updateCriteriasValues($article_id,$criterias,$criteriasIds,$conn);
}
$insideitem = false;
}
}
function characterData($parser,$data){
global $insideitem,$tag,$criterias,$Artikul,$Name,$Price,$i,$conn,$criteriasIds;
if($insideitem){
switch ($tag){
case "ARTIKUL":
$Artikul=$data;
break;
case "NAME":
$Name=$data;
break;
case "COLOR":
$criterias['color']=$data;
break;
case "PRICE":
$Price=$data;
break;
case "VID":
$criterias['vid']=$data;
break;
case "VES":
$criterias['ves']=$data;
break;
case "KOL":
$criterias['kol']=$data;
break;
case "OSTATOK":
$criterias['ostatok']=$data;
break;
case "RAZMER":
$criterias['razmer']=$data;
break;
case "BRAND":
$criterias['brand']=$data;
break;
case "MATERIAL":
$criterias['material']=$data;
break;
}
}
}
//Создание парсера
$xml_parser=xml_parser_create();
//Задание функций-обработчиков
xml_set_element_handler($xml_parser,"startElement","endElement");
xml_set_character_data_handler($xml_parser,"characterData");
$fp=fopen($local_file,"r") or die('Error Reading');
while($data=fread($fp, filesize($local_file))){
//Вызов парсера для обработки данных из файла
xml_parse($xml_parser,$data,feof($fp))
or die (sprintf("XML error: %s at line %d",xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));
}
fclose($fp);
xml_parser_free($xml_parser);?>
_____________
дианка[COLOR=purple]