За последние 24 часа нас посетили 34463 программиста и 1693 робота. Сейчас ищут 647 программистов ...

Почему скрипт стал медленее?

Тема в разделе "PHP для новичков", создана пользователем Dron-Boy, 20 июл 2017.

  1. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Короче ребят написал парсер который парсит xml файл и загружает данные в БД, Сначала написал каряво ну много лишних циклов было. Переписал вчера его вынес все в функции количество циклов уменьшилось так же там есть момент когда я тащу с другого сайта описание товара и в старом скрипте я тащил описание ко всем товарам из XML хотя в бд загружал тоолько определеные а в новом я тяну описание только для нужных товаров. В новом функции подключаются из другого файла. Сегодня решил проверить время какой быстрее выполняется и опа старый выполняется 210,9086 сек новый 239,7481 сек. почему так?
     
  2. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    xml стал больше, бд стало больше, скрипт корявый, тут много вариантов. Где код старого скрипта и данные, код нового и новые данные?
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Алгоритм нового скрипта менее эффективен. Медленные функции стали использоваться чаще.
    --- Добавлено ---
    Во всем виноваты символы @
    --- Добавлено ---
    И запросы к бд в цикле
     
  4. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Запросы в бд не менялись, xml не стал больше, бд тоже не стало больше ну например вот несколько функций новые:
    PHP:
    1. //Собираем основной массив
    2. function createMas($obj){
    3.         $obj = $obj;
    4.             for($i = 0; $i < count($obj);$i++){
    5.                     $categoryId = (array)$obj[$i]->categoryId;
    6.                     $categoryId = $categoryId[0];
    7.                     $url = (array)$obj[$i]->url;
    8.                     $url = $url[0];
    9.                     $picture_main = (array)$obj[$i]->picture[0];
    10.                     $picture_main = $picture_main[0];
    11.                     $picture = (array)$obj[$i]->picture;
    12.                     $name = (array)$obj[$i]->name;
    13.                     $name = $name[0];
    14.                     $id = (array)$obj[$i]['id'];
    15.                     $id = $id[0];
    16.                     $mas1[] =array(
    17.                         'id' => $id,
    18.                         'name' =>$name,
    19.                         'categoryId' =>$categoryId,
    20.                         'url' =>     $url,
    21.                         'picture_main' =>$picture_main,
    22.                         'picture' =>$picture,
    23.                     );
    24.             }          
    25.         return $mas1;
    26.     }
    27.  
    28. //Собираем массив категорий
    29. function select_cat($obj,$cat_id){
    30.         foreach($obj as $val){
    31.             if($cat_id){
    32.                 if(in_array($val['id'],$cat_id) || in_array($val['parentId'],$cat_id)){
    33.                     $mas_cat_name = (array)$val[0];
    34.                     $name = $mas_cat_name[0];
    35.                     $id = $mas_cat_name['@attributes']['id'];
    36.                     $par_id = (array)$val['parentId'];
    37.                     $par_id = $par_id[0];
    38.                     $mas_cat[] = array(
    39.                         'id' => $id,
    40.                         'name' => $name,
    41.                         'parentId' => $par_id,
    42.                     );  
    43.                 }
    44.             }else{
    45.                 $mas_cat_name = (array)$val[0];
    46.                 $name = $mas_cat_name[0];
    47.                 $id = $mas_cat_name['@attributes']['id'];
    48.                 $par_id = (array)$val['parentId'];
    49.                 $par_id = $par_id[0];
    50.                 $mas_cat[] = array(
    51.                         'id' => $id,
    52.                         'name' => $name,
    53.                         'parentId' => $par_id,
    54.                     );  
    55.             }
    56.         }
    57.         return $mas_cat;
    58.     }
    А вот старые

    PHP:
    1. //count($ya->shop[0]->offers->offer)
    2.     for($i = 0; $i < count($ya->shop[0]->offers->offer);$i++){
    3.  
    4.         //$homepage = file_get_contents(trim($ya->shop[0]->offers->offer[$i]->url));
    5.         //preg_match( '/<div class="product-tabs-item product-tabs-item_active">(.*?)<\/div>/is', $homepage, $info );
    6.         $html = file_get_html(trim($ya->shop[0]->offers->offer[$i]->url));
    7.         foreach ($html->find('.product-tabs-item_active') as $div){
    8.             $text = $div->innertext;
    9.         }
    10.         foreach ($html->find('.product-prices__price') as $div){
    11.             $price = $div->innertext;
    12.         }
    13.         $price = preg_replace('~\D+~','',$price);
    14.         $categoryId = (array)$ya->shop[0]->offers->offer[$i]->categoryId;
    15.         $picture = (array)$ya->shop[0]->offers->offer[$i]->picture;
    16.         $name = (array)$ya->shop[0]->offers->offer[$i]->name;
    17.         $id = (array)$ya->shop[0]->offers->offer[$i]['id'];
    18.        
    19.         $mas1[] =array(
    20.         'id' => $id,
    21.         'name' =>$name,
    22.         'price' =>$price,
    23.         'categoryId' =>$categoryId,
    24.         'picture' =>$picture,
    25.         'color' =>$result['color'],
    26.         'yader' =>$result['yader'],
    27.         'simcards' =>$result['simcards'],
    28.         'diagonal' =>$result['diagonal'],
    29.         'size' =>$result['size'],
    30.         'OZU' =>$result['OZU'],
    31.         'akkum' =>$result['akkum'],
    32.         'kamera' =>$result['kamera'],
    33.         'desc' =>     close_tags($text ),
    34.         );
    35.     }
    36.  
    37. //Собираем только нужные мне категории
    38. foreach($ya->shop[0]->categories->category as $val){
    39.     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){
    40.         $mas_cat[] = array(
    41.             'name' => (array)$val[0],
    42.             'parentId' => (array)$val['parentId'],
    43.         );  
    44.     }
    45. }
    --- Добавлено ---
    Вот ссылка на xml
    http://tehnoradar.com.ua/export/306567/market.yandex
     
  5. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Я другого варианта не вижу, как отдать обоим скриптам один xml и пустую базу и тестить их к примеру с помощью phpunit. И смотреть что медленнее, а что быстрее
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Чтобы найти медленное место, надо замерять время работы каждой части скрипта
     
    mahmuzar нравится это.
  7. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Понял спасибо, буду тестить)
     
  8. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    in_array на больших массивах - это капец какой тупняк! isset юзай
     
  9. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Массивы в которых я ищу через in_array не большие не больше 20 элементов, так что не нужно нечего менять. Проблема в функции
    "file_get_html" она долго работает там есть момент когда я описание с помощью нее тяну с другого сайта. Думаю над тем что бы сделать много поточность и тем самым ускорить процесс работы.
     
  10. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    И тем самым получить бан от сервера с которого воруешь контент )
     
  11. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Неа не получу, это мой поставщик сам виноват что незаполняет описание в xml, он знает что я так делаю
     
  12. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ну мультикурлом тяни значит в 50 потоков и все )
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    Мусоровоз приезжает утром чтобы опустошить баки с мусором, а место этого - водитель берет лопату и гребет мусор в бак тратя лишние пол часа, чтобы потом уже спарсить процедуру как подабается.
     
    Dron-Boy и _ne_scaju_ нравится это.
  14. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Интересная мысль, а можно точнее. На чем мой "водитель" тратит лишние пол часа? я потестил весь скрипт дольше всего как раз и выполняется парсинг контента с другого сайта.
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    твой поставщик должен выдавать в готовом, запакованном виде информацию - API. По русски одним из вариантов json
     
  16. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    ну они не предоставляют такую возможность толь xml(
     
  17. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
  18. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
  19. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
  20. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Ладно спасибо. С парсингом самого файла все на ура пользуюсь стандартной функцией. "simplexml_load_file" все рабытает быстро но сам парсинг описания с сайта поставщика занимает много времени.