Ребят, занимаюсь изучением php самостоятельно, когда-то читал одну из книжек по php. Там описывалась работа с ооп всё подобное. Сейчас осваиваю yii2 и непонимае стало вот в чём. Например, строю я сейчас интернет магазин, есть у меня таблица с товарами и сейчас строю скрипт по обновлению этих товаров актуальной информации от поставщика. Всего 5 поставщиков. Изначально построил объект в классе, который 1) берет все строки из таблицы конкретного поставщика (10.000 строк), 2) выгружает ексель файл от поставщика, делает из него массив, 3) сравнивает актуальность наших данных о товаре с поставщиком. дальше уже не по теме будет... И так 5 обращений к нашей таблице, 5 обращений к сторонним файлам екселя, и определенное количество время на выполнение.. Так вот, чтобы как-то более оптимизировать нагрузку на сервер и время выполнение, логично будет сделать всего лишь 1 обращение к нашей таблице с полной выгрузкой, деление массива на ID поставщиков, а дальше просто брать уже готовые массивы данных и использовать для сравнения. И я делаю это через новый, выделенный, объект в классе, выгружая => делю на массивы, а дальше по стандартной схеме, обращаюсь к одному определенному объекту, который раньше выгружал нашу таблицу сам, целых 5 раз, а сейчас это всё для него готово уже через другой объект. И, всё вроде бы работает, но производительность от этого только ухудшилась, и всё в раз 5 сложнее и дольше начало грузиться. От чего бы это? По моей памяти, когда ты обращаешься к определенной функции (объекту в классе), то он один раз выполняется, а следующие разы обращения к нему, он просто выдаёт уже ранее готовые ответы. Вот исходя из такого соображение было и принято такое решение. Кто мог бы подсказать неправильность моего решения? Код (Text): public function FullTableSuppliers($idSup) { $oldArticuls = Unloading::find() ->select(['ID','SUPPLIER_ID','ARTICUL','QUANTITY', 'PRICE']) ->all(); foreach ($oldArticuls as $val) { $arrayOldArticul[$val['SUPPLIER_ID']][$val['ARTICUL']] = array( 'ID' => $val['ID'], 'QUANTITY' => $val['QUANTITY'], 'PRICE' => $val['PRICE'], ); } return $arrayOldArticul[$idSup];
Сейчас понимаю, что и в этом случае моя база загружается не один раз, а 5 раз. Тоесть, если в первом случае были маленькие массивы, то сейчас в 5 вся база и это влияет в десятикратном уменьшении производительности. Оттуда вопрос. Каким способом мне всё таки один раз загрузить базу, сформировать массив и больше не прикосаться к загрузке с сервера? Имеется ввиду в данный момент исполнения скрипта.
Убери yii, напиши на простом php: PHP: function gettable(){ // данные из таблицы } function createExel(){ $table = gettable(); //одно подключение к базе $result = work($table)//все твои 5 сравнений фиг пойми зачем. return $result// результат всех мытарств } function work($table){ //вызывай функцию сколько раз потребуется }