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 | ?> |