Расписание вызовов API до 1 / второго ограничения - PullRequest
1 голос
/ 22 декабря 2011

Я создаю веб-приложение, которое использует Blekko API (API веб-поиска). Приложение многопользовательское.

Мне нужно ограничить количество вызовов API до 1 [call / second]. Это ограничение должно распространяться на все действия всех пользователей, т. Е. Должно быть некоторое расписание для использования API.

Мне нужны предложения, как это сделать?

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

Похоже, что реагирование на вызовы API не так уж важно, так как вы говорите об очередях. Если это так, я бы поместил URL-адрес запроса API в таблицу базы данных. Затем с помощью фонового рабочего процесса я бы сделал что-то для этого:

set_time_limit(0);

$api_requests = array();
while (TRUE)
{
    if (count($api_requests) == 0)
    {
        // get multiple records from DB to limit requests and add
        // to the $api_requests array.

        // if DB returns no results, maybe sleep a few extra seconds
        // to avoid "slamming" the database.
    }

    // get the next API request from the array
    $request = array_shift($api_requests);

    // send API request to Blekko

    // process API results

    // sleep 1 sec
    sleep(1);
}

Это немного «занятый» цикл, но он гарантирует, что вы никогда не будете запускать более одного запроса в секунду, а также гарантирует, что запрос в очереди не будет ждать слишком долго для обработки.

Примечание: Этот метод требует, чтобы ваш сервер не убивал сам процесс, независимо от вызова set_time_limit (). Длительные процессы часто уничтожаются на общих серверах.

0 голосов
/ 11 декабря 2016

Простой способ сделать это - использовать usleep()

usleep(1000000); приостановит выполнение сценария на 1,0 секунды

...