@gzmone
Веб-разработчик

Оптимизация работы с апи, что использовать?

Доброго времени суток, всему пролетариату.
Возник такой вопрос, написал пару классов для работы с апишкой, получая данные с одной апишки, тяну их в бд как полагается (мускул), интерфейс реализован на блейде + livewire
Так вот, при выгрузке на страницу, происходит еще одно обращение к апишке, через цикл for + иф на отсутствие нужных мне данных, вот весь пробег занимает 30с, это УЖАСНО много)
Подскажите, может как-то смогу существенно уменьшить расходуемое время на выполнение моего пробега?

Класс рендера
for($cart_min; $cart_min <= $cart_max; $cart_min++)
        {
            $image = DB::table('room_images')
                ->where('Room_id', $this->room[$cart_min]->Room_id)
                ->get();

            $price = new CartController();
            $this->price_new = $price->price($this->room[$cart_min]->cafe_id, 40, $this->room[$cart_min]->Room_id);
            $this->price_old = round($this->price_new * 1.2);
            if($this->price_new == 0)
            {
                $cart_max += 1;
                continue;
            }
            $this->array[] = [$this->room[$cart_min], $image, $this->price_old, $this->price_new];
        }


В классе прайс логика простая, получаю значения по апи + вытягиваю оттуда циклом по моему айдишнику данные.
Как можно оптимизировать данную работу, может file_get_content заменить, можно пустить какой-то асинхрон, пока-что не пойму какой метод пихнуть)
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 2
Enroller
@Enroller
Немного авантюрист
Я бы не стал "пихнуть" никакой метод
Если интересует распараллеливание работы с внешними API, есть multicurl, им и стоит пользоваться в первую очередь
Если честно, на первый пробег глазами, ответ один - Переписать вопрос, расщедрившись на подробное описание и большие каты(С комментариями), вопросы оптимизации непростые даже для хорошего кода, а тут (Без агрессии мнение), он не очень, трудно понять вашу картину.
Так насколько вижу, хотя я разрабатываю на symfony с doctrine, вы обращаетесь к бд в цикле, это ой как плохо.. И непонятно зачем.
Есть пакетный запрос, сделайте список параметров плоским и вперёд, если данных много организуйте работу чанками, заверните обращение к бд в транзакцию, тогда всё вынесется в оперативку.
Вещи типа $this->room[$cart_min] лучше всё таки делать безопасно через isset()
В идеале плюньте вы на эти массивы и опишите +- внятную модель процесса абстракциями, так общий порядок сильно вырастет а скорость едва ли пострадает(У меня хайлоад на котором 50мс это вообще то дохрена, и всё равно лапшу не пишем)
Ответ написан
Комментировать
@rPman
Причина тормозов - неправильно оформленный запрос, то что можно посчитать на sql сервере, почему то считаешь на бакэнде.

Даже не изучая код, видно что вместо того чтобы делать 100500 запросов, по одному для каждого $this->room[$cart_min]->Room_id, достаточно собрать эти идентификаторы в список и сформировать один запрос на выгрузку сразу всех room_images (так как работа списка не зависит от ответа от sql сервера)

Если количество идентификаторов меньше тысячи, то это можно сделать с помощью select ... from ... where id in (1,2,3,4,5,...)
если больше, то подумать, может пусть списком идентификаторов сам сервер сразу и заведует, храня их в какой-нибудь табличке
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы