У меня есть функция, которые посылают запрос HTTP на www.server.comPHP Предотвращение выполнения функции синхронной (дросселировании пределов через PHP)
Моей задачу с помощью CURL, чтобы убедиться, что www.server.com получает не более один запрос каждые 2 секунды.
Возможное решение:
Создайте функцию checktime()
, которая будет хранить текущее время вызова в базе данных и проверить с базой данных на каждом следующем вызове и сделать паузу системы в течение 2-х секунд:
$oldTime = $this->getTimeFromDatabase();
if ($oldTime < (time() - 2)) { // if its been 2 seconds
$this->setNewTimeInDatabase();
return true;
} else {
sleep(2);
return false;
}
проблемы/вопрос:
Скажем, последний запрос на www.server.com был на 1361951000. Затем 10 других пользователей попытаются выполнить запрос по телефону 1361951001 (1 секунда спустя). checktime()
Функция будет называться.
Поскольку, поскольку прошло только 1 секунда, функция вернет значение false. Все 10 пользователей будут ждать 2 секунды. Означает ли это, что на 1361951003 будет отправлено 10 запросов одновременно? И возможно ли, что время последнего запроса не будет изменено в базе данных из-за пропущенного вызова $ this-> setNewTimeInDatabase() в checktime()
?
Спасибо!
UPDATE:
Я только что сказали, что с помощью цикла может решить эту проблему:
for($i=0;$i<300;$i++)
{
$oldTime = $this->getTimeFromDatabase();
if ($oldTime < (time() - 2)) { // if its been 2 seconds
$this->setNewTimeInDatabase();
return true;
} else {
sleep(2);
return false;
}
}
Но я не вижу логики в этом.
Не было бы лучше сделать проверку на 'www.server.com'? – Zaffy
@ Zaffy У меня нет доступа к 'www.server.com' – rinchik
Другой вариант - создать статическую переменную, которая работает как очередь, а затем через 2 секунды следующий элемент из очереди отправляется на сервер. ком. Это должно быть статической переменной, поэтому она будет использоваться для всех экземпляров вашего класса. – Mike