@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 запросов?
  • Вопрос задан
  • 397 просмотров
Решения вопроса 1
Exploding
@Exploding
wtf?
Сессии и куки работают по разному, если в случае с последними, данные храняться на стороне клиента, то с сессиями наоборот, и по сети "гоняется" лишь её идентификатор, поэтому если не работают куки, то сессии должны работать вроде как всегда.
Попробуйте хранить в сессии, но лучше не надо, т.к. что вы будете делать, когда кол-во уникумов перевалит за ваш лимит в 500 запросов? Переделывать всё?
Я предполагаю, что вы используете бесплатный API с лимитом кол-ва суточных запросов, при этом ключ авторизации для API не используется? Если так - я бы вынес это всё на сторону клиента: обычный ajax запрос на API, который в случае успеха - так же ajax-ом передает готовые данные на ваш php-обработчик, а в нем уже как раз и можно использовать сессии, чтобы после перезагрузки страницы клиент повторно не отправлял запросы на API.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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