За последние 24 часа нас посетили 20565 программистов и 1102 робота. Сейчас ищут 362 программиста ...

Yii2 классы

Тема в разделе "PHP для новичков", создана пользователем gbushmakin, 12 июл 2019.

  1. gbushmakin

    gbushmakin Новичок

    С нами с:
    20 июн 2019
    Сообщения:
    22
    Симпатии:
    0
    Ребят, занимаюсь изучением php самостоятельно, когда-то читал одну из книжек по php. Там описывалась работа с ооп всё подобное.

    Сейчас осваиваю yii2 и непонимае стало вот в чём.

    Например, строю я сейчас интернет магазин, есть у меня таблица с товарами и сейчас строю скрипт по обновлению этих товаров актуальной информации от поставщика. Всего 5 поставщиков.

    Изначально построил объект в классе, который 1) берет все строки из таблицы конкретного поставщика (10.000 строк), 2) выгружает ексель файл от поставщика, делает из него массив, 3) сравнивает актуальность наших данных о товаре с поставщиком. дальше уже не по теме будет...

    И так 5 обращений к нашей таблице, 5 обращений к сторонним файлам екселя, и определенное количество время на выполнение..

    Так вот, чтобы как-то более оптимизировать нагрузку на сервер и время выполнение, логично будет сделать всего лишь 1 обращение к нашей таблице с полной выгрузкой, деление массива на ID поставщиков, а дальше просто брать уже готовые массивы данных и использовать для сравнения. И я делаю это через новый, выделенный, объект в классе, выгружая => делю на массивы, а дальше по стандартной схеме, обращаюсь к одному определенному объекту, который раньше выгружал нашу таблицу сам, целых 5 раз, а сейчас это всё для него готово уже через другой объект.

    И, всё вроде бы работает, но производительность от этого только ухудшилась, и всё в раз 5 сложнее и дольше начало грузиться.

    От чего бы это? По моей памяти, когда ты обращаешься к определенной функции (объекту в классе), то он один раз выполняется, а следующие разы обращения к нему, он просто выдаёт уже ранее готовые ответы. Вот исходя из такого соображение было и принято такое решение. Кто мог бы подсказать неправильность моего решения?

    Код (Text):
    1.     public function FullTableSuppliers($idSup)
    2.     {
    3.  
    4.  
    5.             $oldArticuls = Unloading::find()
    6.                 ->select(['ID','SUPPLIER_ID','ARTICUL','QUANTITY', 'PRICE'])
    7.                 ->all();
    8.  
    9.  
    10.             foreach ($oldArticuls as $val) {
    11.  
    12.                 $arrayOldArticul[$val['SUPPLIER_ID']][$val['ARTICUL']] = array(
    13.                     'ID' => $val['ID'],
    14.                     'QUANTITY' => $val['QUANTITY'],
    15.                     'PRICE' => $val['PRICE'],
    16.                 );
    17.  
    18.             }
    19.  
    20.             return $arrayOldArticul[$idSup];
     
  2. gbushmakin

    gbushmakin Новичок

    С нами с:
    20 июн 2019
    Сообщения:
    22
    Симпатии:
    0
    Сейчас понимаю, что и в этом случае моя база загружается не один раз, а 5 раз. Тоесть, если в первом случае были маленькие массивы, то сейчас в 5 вся база и это влияет в десятикратном уменьшении производительности.

    Оттуда вопрос. Каким способом мне всё таки один раз загрузить базу, сформировать массив и больше не прикосаться к загрузке с сервера? Имеется ввиду в данный момент исполнения скрипта.
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Убери yii, напиши на простом php:
    PHP:
    1. function gettable(){
    2.   // данные из таблицы
    3. }
    4.  
    5. function createExel(){
    6.    $table =  gettable();  //одно подключение к базе
    7.  
    8.     $result = work($table)//все твои 5 сравнений фиг пойми зачем.
    9.  
    10. return $result// результат всех мытарств
    11. }
    12.  
    13. function work($table){
    14.    //вызывай функцию сколько раз потребуется
    15. }
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Нет, выполняется каждый раз Чтоб выдавало уже готовые, надо так её написать