Я работаю над приложением, которое использует API. Мне разрешено делать только 2 запроса в минуту к серверу. Поэтому я использую свой собственный сервер, который выбирает данные 2 раза в минуту, и мое приложение запрашивает данные с моего сервера.
На моем сервере есть база данных, в которой хранятся нужные мне данные. Поэтому, если пользователю нужно, чтобы данные отображались на его смартфоне или планшете, он получает данные с моего сервера.
У меня есть сценарий PHP, который проверяет, старше ли последняя запись в моей базе данных, чем 30 секунд, если да, сценарий извлекает текущие данные с сервера API и сохраняет их в моей базе данных.
Но теперь, если есть, например, 1000 пользователей и все запрашивают текущие данные одновременно — скрипт get вызывается тысячу раз, и если данные в моей базе данных старше 30 секунд, он получает данные с сервера API — выполняет ли мой сервер запросы к Сервер API, пока текущие данные не доступны в моей базе данных? Я волнуюсь, что я превышаю 2 запроса / минуту.
Используйте задание cron, чтобы извлекать данные с сервера ровно каждые 30 секунд и вырезать часть, в которой они дважды проверяют каждый отдельный запрос. Это излишне, если у вас уже есть работа cron.
РЕДАКТИРОВАТЬ
Если кроны не вариант, вы можете попробовать использовать блокировку файла.
Идея состоит в том, что, когда сделан запрос, вы устанавливаете блокировку файла в вашей файловой системе и снимаете блокировку после завершения запроса. Каждый раз, когда делается запрос, проверьте, не заблокирован ли файл, если это так, это означает, что кто-то другой в данный момент запускает запрос, и его можно пропустить. Если файл разблокирован, вы можете сохранить в нем текущую метку времени и проверить, не старше ли эта метка времени, чем 30 секунд.
// get current time by reading the file. You will need to create the file manually initially with the timestamp in it
$last_run = file_get_contents('foo.txt');
// open the file
$fp = fopen("foo.txt", "w");
// check if file is locked
if (flock($fp, LOCK_EX | LOCK_NB)) {
// check that it's been more than 30 seconds
if($last_run > (time() - 30)){
// if file is unlocked update it with current timestamp
$fwrite($fp, time());
// make request to server, upload to db
// after request has been made, unlock the file
flock($fp, LOCK_UN);
}
} else {
// someone else is triggering the request, get data from db
}
Других решений пока нет …