Короче ребят написал парсер который парсит xml файл и загружает данные в БД, Сначала написал каряво ну много лишних циклов было. Переписал вчера его вынес все в функции количество циклов уменьшилось так же там есть момент когда я тащу с другого сайта описание товара и в старом скрипте я тащил описание ко всем товарам из XML хотя в бд загружал тоолько определеные а в новом я тяну описание только для нужных товаров. В новом функции подключаются из другого файла. Сегодня решил проверить время какой быстрее выполняется и опа старый выполняется 210,9086 сек новый 239,7481 сек. почему так?
xml стал больше, бд стало больше, скрипт корявый, тут много вариантов. Где код старого скрипта и данные, код нового и новые данные?
Алгоритм нового скрипта менее эффективен. Медленные функции стали использоваться чаще. --- Добавлено --- Во всем виноваты символы @ --- Добавлено --- И запросы к бд в цикле
Запросы в бд не менялись, xml не стал больше, бд тоже не стало больше ну например вот несколько функций новые: PHP: //Собираем основной массив function createMas($obj){ $obj = $obj; for($i = 0; $i < count($obj);$i++){ $categoryId = (array)$obj[$i]->categoryId; $categoryId = $categoryId[0]; $url = (array)$obj[$i]->url; $url = $url[0]; $picture_main = (array)$obj[$i]->picture[0]; $picture_main = $picture_main[0]; $picture = (array)$obj[$i]->picture; $name = (array)$obj[$i]->name; $name = $name[0]; $id = (array)$obj[$i]['id']; $id = $id[0]; $mas1[] =array( 'id' => $id, 'name' =>$name, 'categoryId' =>$categoryId, 'url' => $url, 'picture_main' =>$picture_main, 'picture' =>$picture, ); } return $mas1; } //Собираем массив категорий function select_cat($obj,$cat_id){ foreach($obj as $val){ if($cat_id){ if(in_array($val['id'],$cat_id) || in_array($val['parentId'],$cat_id)){ $mas_cat_name = (array)$val[0]; $name = $mas_cat_name[0]; $id = $mas_cat_name['@attributes']['id']; $par_id = (array)$val['parentId']; $par_id = $par_id[0]; $mas_cat[] = array( 'id' => $id, 'name' => $name, 'parentId' => $par_id, ); } }else{ $mas_cat_name = (array)$val[0]; $name = $mas_cat_name[0]; $id = $mas_cat_name['@attributes']['id']; $par_id = (array)$val['parentId']; $par_id = $par_id[0]; $mas_cat[] = array( 'id' => $id, 'name' => $name, 'parentId' => $par_id, ); } } return $mas_cat; } А вот старые PHP: //count($ya->shop[0]->offers->offer) for($i = 0; $i < count($ya->shop[0]->offers->offer);$i++){ //$homepage = file_get_contents(trim($ya->shop[0]->offers->offer[$i]->url)); //preg_match( '/<div class="product-tabs-item product-tabs-item_active">(.*?)<\/div>/is', $homepage, $info ); $html = file_get_html(trim($ya->shop[0]->offers->offer[$i]->url)); foreach ($html->find('.product-tabs-item_active') as $div){ $text = $div->innertext; } foreach ($html->find('.product-prices__price') as $div){ $price = $div->innertext; } $price = preg_replace('~\D+~','',$price); $categoryId = (array)$ya->shop[0]->offers->offer[$i]->categoryId; $picture = (array)$ya->shop[0]->offers->offer[$i]->picture; $name = (array)$ya->shop[0]->offers->offer[$i]->name; $id = (array)$ya->shop[0]->offers->offer[$i]['id']; $mas1[] =array( 'id' => $id, 'name' =>$name, 'price' =>$price, 'categoryId' =>$categoryId, 'picture' =>$picture, 'color' =>$result['color'], 'yader' =>$result['yader'], 'simcards' =>$result['simcards'], 'diagonal' =>$result['diagonal'], 'size' =>$result['size'], 'OZU' =>$result['OZU'], 'akkum' =>$result['akkum'], 'kamera' =>$result['kamera'], 'desc' => close_tags($text ), ); } //Собираем только нужные мне категории foreach($ya->shop[0]->categories->category as $val){ if($val['id'] == 256206 or $val['id'] == 256217 or $val['id'] == 370429 or $val['id'] == 256205 or $val['id'] == 371390 or $val['id'] == 371962 or $val['parentId'] == 223128 or $val['id'] == 223128 or $val['id'] == 370104 or $val['id'] == 370102 or $val['id'] == 256197 or $val['parentId'] == 256197 or $val['id'] == 254015 or $val['parentId'] == 254015 or $val['id'] == 366548){ $mas_cat[] = array( 'name' => (array)$val[0], 'parentId' => (array)$val['parentId'], ); } } --- Добавлено --- Вот ссылка на xml http://tehnoradar.com.ua/export/306567/market.yandex
Я другого варианта не вижу, как отдать обоим скриптам один xml и пустую базу и тестить их к примеру с помощью phpunit. И смотреть что медленнее, а что быстрее
Массивы в которых я ищу через in_array не большие не больше 20 элементов, так что не нужно нечего менять. Проблема в функции "file_get_html" она долго работает там есть момент когда я описание с помощью нее тяну с другого сайта. Думаю над тем что бы сделать много поточность и тем самым ускорить процесс работы.
Неа не получу, это мой поставщик сам виноват что незаполняет описание в xml, он знает что я так делаю
Мусоровоз приезжает утром чтобы опустошить баки с мусором, а место этого - водитель берет лопату и гребет мусор в бак тратя лишние пол часа, чтобы потом уже спарсить процедуру как подабается.
Интересная мысль, а можно точнее. На чем мой "водитель" тратит лишние пол часа? я потестил весь скрипт дольше всего как раз и выполняется парсинг контента с другого сайта.
твой поставщик должен выдавать в готовом, запакованном виде информацию - API. По русски одним из вариантов json
http://www.realcoding.net/articles/php5-kak-rabotat-s-xml-cherez-simplexml.html --- Добавлено --- ru.stackoverflow.com/questions/45420/Что-лучше-для-работы-с-xml-в-php
Ладно спасибо. С парсингом самого файла все на ура пользуюсь стандартной функцией. "simplexml_load_file" все рабытает быстро но сам парсинг описания с сайта поставщика занимает много времени.