Приветствую, имеется следующий код PHP: foreach($dostup_yaht as $v) { $yacht_cursor = $collection_yachts->findOne(['id'=>$v->yachtId]); $base_cursor = $collection_bases->findOne(['id'=>$v->startBaseId]); $yacht_img = $yacht_cursor['images']; if($yacht_cursor) { if($v->price > 0 && $yacht_cursor->length > 0 && $yacht_cursor->year > 0) { $yacht_dostup_id[] = [ 'yachtId' => $v->yachtId, 'name' => $v->yacht, 'city' => $base_cursor->city, 'country' => $base_cursor->country, 'year' => $yacht_cursor->year, 'mainimage' => GetImageMain($yacht_img), 'model' => $yacht_cursor->model, 'cabins' => $yacht_cursor->cabins, 'kind' => $yacht_cursor->kind, 'wc' => $yacht_cursor->wc, 'berths' => $yacht_cursor->berths, 'mainsailType' => $yacht_cursor->mainsailType, 'proizvod' => $yacht_cursor->shipyardId, 'length' => $yacht_cursor->length, 'startBase' => $v->startBase, 'endBase' => $v->endBase, 'price' => $v->price, 'startPrice' => $v->startPrice, 'equipmentIds' => $yacht_cursor['equipmentIds'], 'discountPercentage' => $v->discountPercentage, 'ball' => abs($v->price / $yacht_cursor->length / ($yacht_cursor->year - 2023)) ]; } } } В $dostup_yaht получаю информацию о доступности из апи, перебираю его, и создаю многомерный массив в который подставляю значения, которые уже берутся непосредственно из БД, данное решение рабочее, но очень долгое, так как в $dostup_yaht получаю 5к элементов. Время выполнения данного блока 18-20 секунд на пк на легеньком хостинге 40-50 сек. Нужна подсказка, как ускорить данный участок кода, сделать его, как можно быстрее, если у кого то есть примеры с подобными работами, буду рад посмотреть, ну или же жду советов, как можно реализовать это
жуть, а не имена по теме..... а зачем вам сразу все 5к записей? Обычно делают пагинацию, слыхали про такое? опять же, может проще получить из апи данные о доступности - и на основе этих данных делать запрос к БД, а не перебирать ВСЮ бд? То есть получили массив ид яхт, в запросе указали WHERe IN(тут полученные ид) ну и как всегда скажу - что запросы внутри цикла - зло )))
Конкретно на вывод пагинация конечно же стоит, по 50 записей, По варианта получения данных о доступности из апи, и обращаться исходя из ответа в БД, вариант хороший, работающий, но проблема в том, что доступность возвращает не только перечень доступных яхт, но еще и цены, базы и ТД, в дальнейшем получается, что сортировка по ценам не возможна, а так же по тем параметрам, что возвращает доступность
1) может в кроне тогда просто обновлять значения в текущей бд, а потом делать нормальную быструю выборку из бд, с пагинацией? и не только на вывод, но и на запрос... 2) настолько ли плохо апи, что не позволяет указывать условия, которые вам нужны, а отдает прямо просто весь список?
Обновлять значения тоже не вариант, так как доступность и цены возвращается непосредственно по указанной дате пользователем, данные всегда разные
findOne запрос к БД, использую mongodb Апи поддерживает выборку по нужным параметрам, но возможности отсортировать например по цене от самой низкой к высокой нету --- Добавлено --- Ну и конечно же не по всем нужным параметрам апи позволяет делать выборку
ну все равно, я склоняюсь больше к варианту - выкачать все данные, за все даты обозримые в локальную БД не думаю что цены и другие данные, кроме доступности сильно меняются например в течении дня.... обновлять ночью например из апи получать только ид доступных яхт и условий - что может реализовать апи, потом эти данные в запрос подставлять - а сами данные брать из локальной БД, по феншую, с сортировками, доп выборками, пагинацией