@michisvlad

Как правильно кэшировать запросы к API сервиса?

При каждом заходе на php страничку сайта происходит обращение к некому сервису через их API для получения некого массива информации. Но у сервиса ограниченное количество обращений по API в сутки для одного аккаунта. Заметил что я очень быстро израсходовал все доступные обращения к сервису по API, хотя переходов на сайт было гораздо меньше чем обращений к сервису, даже с учётом всех поисковых и не только ботов. То-есть на сайт перешло например ~100 человек, а запросов к сервису ~500.
Вот код обращения:

//Запись определённых ключей из массива в переменные
	$key1= getData()['Key1'];
	$key2= getData()['Key2'];
	$key3= getData()['Key3'];
	$key4= getData()['Key4'];
	$key5= getData()['Key5'];
	$key6= getData()['Key6'];

	//Отправка запроса к сервису и получение массива информации
	function getData() {
		return curl('https:/api.example.com/json_array');
	}//Функцию curl сюда вставлять не буду, там обычный curl запрос
	//название там другое, тут указал curl для примера
//Далее как то манипулирую с этими данными...


Только сейчас в момент написания вопроса понял что сделал глупость, надо было в одну переменную вынести функцию, а уже потом с этой переменной брать информацию.
$myarray = getData();

	$key1= $myarray['Key1'];
	$key2= $myarray['Key2'];
	$key3= $myarray['Key3'];
	$key4= $myarray['Key4'];
	$key5= $myarray['Key5'];
	$key6= $myarray['Key6'];


Я решил попробовать сделать так, если я уже обращался к сервису, сохранять массив в cookie и потом уже во всех других случаях читать этот массив из cookie и использовать его когда опять понадобиться эта информация из массива, чтобы постоянно не обращаться к сервису.

function getData() {
		if (isset($_COOKIE['arrayData']) && !empty($_COOKIE['arrayData'])) {
			return unserialize($_COOKIE['arrayData']);
		} else {
			$arrayData = curl('https:/api.example.com/json_array');
			setcookie('arrayData', serialize($arrayData));
			return curl('https:/api.example.com/json_array');
			//И тут оказывается глупость сделал, два раза curl запрос сделал правильнее наверное так:
			//return $arrayData;
		}
	}


Я решил сделать только через куки, могу ещё добавить по такой же аналогии сохранение в сессию. Но проблема вот в чём. Для обычных людей возможно это и прокатило бы, но на сайт заходят очень много всяких поисковых ботов/роботов и другой ботовой нечисти , которые заразы берут и инициализируют функцию с запросом к этому сервису.
И как я понимаю, у некоторых ботов отключены куки и/или сессии (вот скриншот -> ага, не разрешается ссылки оставлять =(), и для ботов этот способ не сработает, так как после каждого нового обновления страницы куки у них будут чистые и запрос будет отправляться снова и снова =(.

60e5ed9106668045676838.png

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

Кто ответит по теме - большое спасибо и плюс вам в карму!

P.S. Кстати интересно, я правильно понимаю, что если я буду получать массив с сайта через file_get_contents или через curl разницы например в скорости в данном примере не будет?
И правильно я понимаю, если я инициализирую например 5 переменных которые обращаются к этой одной функции, то тогда функция выполняется 5 раз и получается делается 5 запросов?
  • Вопрос задан
  • 410 просмотров
Решения вопроса 1
Exploding
@Exploding
wtf?
Сессии и куки работают по разному, если в случае с последними, данные храняться на стороне клиента, то с сессиями наоборот, и по сети "гоняется" лишь её идентификатор, поэтому если не работают куки, то сессии должны работать вроде как всегда.
Попробуйте хранить в сессии, но лучше не надо, т.к. что вы будете делать, когда кол-во уникумов перевалит за ваш лимит в 500 запросов? Переделывать всё?
Я предполагаю, что вы используете бесплатный API с лимитом кол-ва суточных запросов, при этом ключ авторизации для API не используется? Если так - я бы вынес это всё на сторону клиента: обычный ajax запрос на API, который в случае успеха - так же ajax-ом передает готовые данные на ваш php-обработчик, а в нем уже как раз и можно использовать сессии, чтобы после перезагрузки страницы клиент повторно не отправлял запросы на API.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы