View difference between Paste ID: AFgDG4vJ and 8wXin3wL
SHOW: | | - or go back to the newest paste.
1-
<?
1+
<?
2-
// парсилка xml выгрузки слона любого размера в базу SQLite
2+
// парсинг товарного XML фида в базу SQLite
3-
// © skray 22.02.2016
3+
// http://php5.kiev.ua/manual/ru/class.xmlreader.html
4-
Error_Reporting(E_ALL);
4+
// http://phppot.com/php/php-xml-reader/
5-
ini_set('display_errors', TRUE);
5+
// http://i.kenfin.ru/article/parsim-xml-s-pomoschju-xmlreader
6-
@ini_set('memory_limit', '512M');
6+
7-
@set_time_limit(0);
7+
Error_Reporting(E_ALL);
8-
@ini_set('max_execution_time',0);
8+
ini_set('display_errors', TRUE);
9-
@ini_set('set_time_limit',0);
9+
@ini_set('memory_limit', '512M');
10-
@ob_end_flush();
10+
@set_time_limit(0);
11-
$start_time = microtime(true);
11+
@ini_set('max_execution_time',0);
12-
$_db="data/slonxml.db";  // название будущей базы // папка data в данном примере должна уже быть создана
12+
@ini_set('set_time_limit',0);
13-
$_xml="automagnitol.xml";  // xml файл, который нужно распарсить
13+
@ob_end_flush();
14-
 
14+
$start_time = microtime(true);
15-
function opendbx()
15+
$_db = "data/new.db";               // название будущей базы - папка data в данном примере должна уже быть создана
16-
{
16+
$_xml = "2Gb.xml";                  // xml файл, который нужно распарсить
17-
	global $_db,$dbx;
17+
 
18-
	$dbx = new SQLite3($_db);
18+
 
19-
	$dbx->busyTimeout(5000);
19+
function opendbx()
20-
	$dbx->exec('PRAGMA journal_mode=WAL;');
20+
{
21-
}
21+
    global $_db,$dbx;
22-
22+
    $dbx = new SQLite3($_db);
23-
if (!file_exists($_db)) 
23+
    $dbx->busyTimeout(5000);
24-
{
24+
    $dbx->exec('PRAGMA journal_mode=WAL;');
25-
	opendbx();
25+
}
26-
	$dbx->exec('CREATE TABLE IF NOT EXISTS xml (id INTEGER PRIMARY KEY, _id TEXT, merchant_id TEXT, gs_product_key TEXT, article TEXT, gs_category_id TEXT, picture TEXT, original_picture TEXT, name TEXT, description TEXT, vendor TEXT, model TEXT, url TEXT, price TEXT, rezint INTEGER, reztxt TEXT);');
26+
27-
	$dbx->close();
27+
 
28-
}
28+
if (!file_exists($_db))
29-
29+
{
30-
opendbx();  // открываем базу
30+
    opendbx();
31-
31+
    $dbx->exec('CREATE TABLE IF NOT EXISTS xml (id INTEGER PRIMARY KEY, _id TEXT, merchant_id TEXT, gs_product_key TEXT, article TEXT, gs_category_id TEXT, picture TEXT, original_picture TEXT, name TEXT, description TEXT, vendor TEXT, model TEXT, url TEXT, price TEXT, rezint INTEGER, reztxt TEXT);');
32-
$reader = new XMLReader();  // запускаем паука XMLReader
32+
    $dbx->close();
33-
$reader->open($_xml);
33+
}
34-
$g=0;
34+
 
35-
35+
opendbx();                  // открываем базу
36-
function kvchnah($ssl) // удаляем кавычки
36+
 
37-
{
37+
$reader = new XMLReader();  // запускаем паука XMLReader
38-
	$ssl=preg_replace("/\"|\'/",'',$ssl);
38+
$reader->open($_xml);
39-
	return $ssl;
39+
$g=0;
40-
}
40+
41-
41+
42-
$dbx->exec('BEGIN IMMEDIATE;'); 
42+
function kvchnah($ssl)      // удаляем кавычки
43-
43+
{
44-
while ($reader->read()) 
44+
    $ssl=preg_replace("/\"|\'/",'',$ssl);
45-
{
45+
    return $ssl;
46-
	if ($reader->nodeType == XMLREADER::ELEMENT&&$reader->localName == 'offer') // находим блок offer
46+
}
47-
	{	
47+
48-
		$offer = new SimpleXMLElement($reader->readouterXML()); // передаем найденный блок функции SimpleXML в оперативную память и распарсиваем блок
48+
 
49-
		$sname= kvchnah($offer->name);
49+
$dbx->exec('BEGIN IMMEDIATE;');
50-
		$price= kvchnah($offer->price);
50+
 
51-
		$picture = $offer->picture;
51+
while ($reader->read())
52-
		$original_picture = $offer->original_picture;
52+
{
53-
		$description = kvchnah($offer->description);
53+
    if ($reader->nodeType == XMLREADER::ELEMENT&&$reader->localName == 'offer') // находим блок offer
54-
		$vendor = kvchnah($offer->vendor);
54+
    {  
55-
		$model = kvchnah($offer->model);
55+
        $offer = new SimpleXMLElement($reader->readouterXML());                 // передаем найденный блок функции SimpleXML в ОЗУ и распарсиваем блок
56-
		$url = $offer->url;
56+
        $sname = kvchnah($offer->name);
57-
		$attr=$offer->attributes();
57+
        $price = kvchnah($offer->price);
58-
		$gs_category = $attr['gs_category_id'];	
58+
        $picture = $offer->picture;
59-
		$merchant_id = $attr['merchant_id'];
59+
        $original_picture = $offer->original_picture;
60-
		$article=$attr['article']; 
60+
        $description = kvchnah($offer->description);
61-
		$productkey=$attr['gs_product_key'];
61+
        $vendor = kvchnah($offer->vendor);
62-
		$_id=$attr['id'];
62+
        $model = kvchnah($offer->model);
63-
		// записываем в базу
63+
        $url = $offer->url;
64-
		$dbx->exec("INSERT INTO xml (_id, merchant_id, gs_product_key, article, gs_category_id, picture, original_picture, name, description, vendor, model, url, price) VALUES ('".$_id."', '".$merchant_id."', '".$productkey."', '".$article."', '".$gs_category."', '".$picture."', '".$original_picture."', '".$sname."', '".$description."', '".$vendor."', '".$model."', '".$url."', '".$price."');");
64+
        $attr = $offer->attributes();
65-
		
65+
        $gs_category = $attr['gs_category_id'];
66-
		if($g/200==intval($g/200))
66+
        $merchant_id = $attr['merchant_id'];
67-
		{
67+
        $article = $attr['article'];
68-
			$dbx->exec('COMMIT;');	
68+
        $productkey = $attr['gs_product_key'];
69-
			$dbx->exec('BEGIN IMMEDIATE;');
69+
        $_id = $attr['id'];
70-
			echo "$g -  <br>";
70+
		
71-
		}				
71+
        // записываем все в БД
72-
		$g++;					
72+
        $dbx->exec("INSERT INTO xml (_id, merchant_id, gs_product_key, article, gs_category_id, picture, original_picture, name, description, vendor, model, url, price) VALUES ('".$_id."', '".$merchant_id."', '".$productkey."', '".$article."', '".$gs_category."', '".$picture."', '".$original_picture."', '".$sname."', '".$description."', '".$vendor."', '".$model."', '".$url."', '".$price."');");
73-
	}
73+
       
74-
}
74+
        if($g/200==intval($g/200))
75-
		
75+
        {
76-
$dbx->exec('COMMIT;');
76+
            $dbx->exec('COMMIT;'); 
77-
$dbx->close();	
77+
            $dbx->exec('BEGIN IMMEDIATE;');
78-
78+
            echo "$g -  <br>";
79-
$exec_time = round(microtime(true) - $start_time, 3);
79+
        }              
80-
$memory = round(memory_get_usage() / 1024, 3);
80+
        $g++;                  
81-
echo '<br><hr><br> Time: '.$exec_time.' Sec. | Memory: '.$memory.' Kb. ';
81+
    }
82-
82+
}
83-
83+
       
84
$dbx->exec('COMMIT;');
85
$dbx->close(); 
86
 
87
$exec_time = round(microtime(true) - $start_time, 3);
88
$memory = round(memory_get_usage() / 1024, 3);
89
echo '<br><hr><br> Время: '.$exec_time.' сек. | Память: '.$memory.' Kb. ';
90
  
91
?>