На сайт ложится слишком большая нагрузка, так как на странице около 20 запросов API. Поэтому думаю нужно переходить на многопоточность. Инструкцию изучил, но так и не разобрался. Суть в следующем. При получении ответа от api создаются файлы с кэшированными данными, откуда затем берется информация для вывода. Структура запросов такая. С каждым новым обращением к Api нагрузка на сайт сильно увеличивается. Так выглядит структура вызова Api. №1 PHP: <?php $cache_ttl = 21600; // время жизни кэша в секундах $cache_file_airlines = "tmp/ish.data"; $cache_file_products = "tmp/ish1.data"; $map = function ($array, $from, $to) { $result = []; if (!empty($array) && is_array($array)) { foreach ($array as $element) { $key = $element[$from] ? : null; $value = $element[$to] ? : null; if ($key && $value) { $result[$key] = $value; } } } return $result; }; if (file_exists($cache_file_airlines) && (time() - filemtime($cache_file_airlines)) < $cache_ttl) { // берём кэшированные данные $get_airlines = file_get_contents($cache_file_airlines); } else { $get_airlines = file_get_contents('https://site.ru/json/airlines.json'); file_put_contents($cache_file_airlines, $get_airlines); } $airlines = array_column($dataAER, 'name', 'iata'); if (file_exists($cache_file_products) && (time() - filemtime($cache_file_products)) < $cache_ttl) { // берём кэшированные данные $response = file_get_contents($cache_file_products); } else { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://site.ru/v3/prices_for_dates?origin=MOW&destination=AER&token=*******&departure_at=" . date('Y-m-d')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "X-Access-Token: **********" )); $response = curl_exec($ch); curl_close($ch); file_put_contents($cache_file_products, $response); } $products = json_decode($response, true); $replace_value = function ($key, $val) use ($airlines) { $response = $val; switch ($key) { case 'airline': $response = $airlines[$val]; break; } return $response; } ?> <div class="table-responsive" style="overflow-x:hidden;background: var(--responsiv-color)!important; display: flex; flex-direction: column; width: 100%;margin-left: auto; margin-right: auto; list-style-type: none;overflow-y:hidden;"> <?php if (isset($products['data']) && is_array($products['data'])) { foreach ($products['data'] as $key => $dataAER) ?> Далее следует вывод данных из этого API. Затем еще один вызов API. №2 PHP: <?php $cache_ttl = 21600; // время жизни кэша в секундах $cache_file_airlines = "tmp/ish2.data"; $cache_file_products = "tmp/ish3.data"; $map = function ($array, $from, $to) { $result = []; if (!empty($array) && is_array($array)) { foreach ($array as $element) { $key = $element[$from] ? : null; $value = $element[$to] ? : null; if ($key && $value) { $result[$key] = $value; } } } return $result; }; if (file_exists($cache_file_airlines) && (time() - filemtime($cache_file_airlines)) < $cache_ttl) { // берём кэшированные данные $get_airlines = file_get_contents($cache_file_airlines); } else { $get_airlines = file_get_contents('https://site.ru/json/airlines.json'); file_put_contents($cache_file_airlines, $get_airlines); } $airlines = array_column($dataSIP, 'name', 'iata'); if (file_exists($cache_file_products) && (time() - filemtime($cache_file_products)) < $cache_ttl) { // берём кэшированные данные $response = file_get_contents($cache_file_products); } else { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://site.ru/v3/prices_for_dates?origin=MOW&destination=SIP&token=******&departure_at=" . date('Y-m-d')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "X-Access-Token: ******" )); $response = curl_exec($ch); curl_close($ch); file_put_contents($cache_file_products, $response); } $products = json_decode($response, true); $replace_value = function ($key, $val) use ($airlines) { $response = $val; switch ($key) { case 'airline': $response = $airlines[$val]; break; } return $response; } ?> <div class="table-responsive" style="overflow-x:hidden;background: var(--responsiv-color)!important; display: flex; flex-direction: column; width: 100%;margin-left: auto; margin-right: auto; list-style-type: none;overflow-y:hidden;"> <?php if (isset($products['data']) && is_array($products['data'])) { foreach ($products['data'] as $key => $dataSIP) ?> Далее следует вывод данных из этого API. Разница между этими вызовами в файлах с кэшированными данными и этими переменными Код (Text): $dataSIP и $ dataAER. На одной странице 21 такой запрос. Как можно объединить эти запросы в один или облегчить нагрузку? Это снизит нагрузку на сервер? Как еще можно снизить нагрузку? --- Добавлено --- После десятого запроса, сайт стал значительно долго загружаться.
Сам сайт (аBиа-аBиа.ру) (большую букву заменить на русскую) Сайт на голом php+html Под каждый город идет отдельный запрос, затем идет вывод информации и так 21 раз, каждые 5 минут выполняется Cron задача по удалению кэшированных данных из папки tmp/ , затем когда любой посетитель заходит на сайт, происходит обновление кэшированных данных (это уже в php коде происходит), это нужно чтобы цены были актуальны всегда, когда кэшированные данные записываются заново в этот момент идет долгая загрузка сайта. --- Добавлено --- Для наглядности сейчас сделал удаление по крону данных 1 минута.
видимо вот в этом проблема ))) тебе точно нужно на одной странице иметь инфу про 21 город? предположу, что требуется только конкретный один.
Ну ты сам себя загнал в угол. Сформулировал задачу так, чтобы оправдать неизбежность зла. Попробуй другой подход, который не будет требовать жертв. --- Добавлено --- Надо сделать потребности скромнее. --- Добавлено --- Я думаю что сервер-источник может иметь квоты по загрузке с одного адреса. Не стоит расчитывать на параллельные запросы. Лучше распредели их по времени. Допустим, ты решаешь что тебя устроит возраст кешированных данных в 10 минут. Пусть тогда 21 запрос будет распределен в расписании чтобы в целом успеть обойти всё что надо за 10 минут. Нутыпонел: по два уникальных запроса в минуту примерно. Тогда веб страничка будет иметь данные всегда готовыми без ожидания -- брать только из кеша, без фолбека к реальному запросу s2s.
То-бишь сделать задачи по крону удалять не все файлы сразу, а сделать на каждый файл отдельное время удаления, путем подбора, определить лучший временной период?
Нет. Я предложил вообще не инвалидировать (ты называешь удалением) кеш, а заполнять его в очереди заданий с заранее заданной периодичностью.
Отключить принудительное удаление, а в php индивидуально выставить время жизни кэша каждому запросу, чтоб разное было?
Билят!!! Не инвалидировать -- значить считать что кеш всегда актуален и читать из него с одной и той же скоростью. Да, в первые десять минут после запуска шайтан машины с кроном кеш будет пустым. А потом всегда наполненными. Понял алгоритм? --- Добавлено --- Есть процесс писатель и есть процесс читатель. Удалять никто ничего не будет. Так трудно ломать шаблон, да?
Они всегда устаревшие, это аксиома! Просто допусти что они будут актуализироваться с заданной частотой. --- Добавлено --- И тогда отпадет необходимость в ожидании, страница будет формироваться быстро всегда, график зависимости от нагрузки станет очень "пологий".
Сто тысяч рублей. И это будет только бекенд, никакой верстки. Или напрягись и врикни сам в идею. Бесплатно.
Чтобы было понятнее, приведу пример: ты приходишь в некий фастфуд за ланчем. Если они будут начинать готовить только после заказа, ты будешь ждать свой бургер полчаса. А если они будут гтовить заранее, то получишь моментально. Но правда бургер можеи быть 10 минутной свежести, они так расчитали. А может и свежий, если повезет. Но не старше 10 минут, т.к. старые бургеры они отправляют в... лучше не знать куда. И гтовят новые.