api — В PHP как остановить функцию, подождать и рекурсивно перезапустить себя, пока не будет выполнено какое-то условие?

Если какое-то условие выполнено, как я могу сделать функцию:

  1. Прекратить выполнение остальной функции
  2. Подожди Х раз
  3. Перезапустите функцию

Будет ли это что-то вроде:

function someFunc() {
if (x == 0) {
sleep(60);
someFunc();
return;
}
...other code only to be run if above is false...
}
someFunc();

...other code only to be run if above function finishes running completely...

Если это уместно и есть какая-то библиотека для обработки ограничений APi или что-то еще, я делаю это для соединения API. Сначала я получаю удар через

file_get_contents('php://input')

который содержит URL. Затем я нажал на URL с

file_get_contents( $url )

и после разбора $http_response_header в $headers массив, проверьте его заголовок как if ($header['api_limit'] == 0) ... (в приведенном выше примере это x). Если "x" 0, тогда я хочу, чтобы функция подождала минуту, пока цикл ограничения не был сброшен, и запустила второй file_get_contents( $url ) и анализ, который следует за этим снова.

Основная причина, по которой я хотел справиться с этим, состоит в том, чтобы не записывать ничего. Веб-крючок, который я получаю через file_get_contents('php://input') бывает только один раз. Если достигнут предел скорости API, и я пытаюсь использовать URL-адрес в веб-крючке, но не удается, то этот URL теряется. Так что я надеялся, что функция просто подождет X раз, пока rte сбрасывается, пока не попытается использовать полученный от webhook URL с file_get_contents($url) снова. Это плохая практика как-то?

0

Решение

При ограниченных по скорости ресурсах вы обычно хотите кэшировать копию данных для блоков по X минут, чтобы ограничение никогда не превышалось. Например, в случае максимум 10 запросов в час вы должны кэшировать ответ в течение как минимум 6 минут, прежде чем пытаться получить новый ответ.

Не стоит останавливать весь интерпретатор PHP до тех пор, пока ограничение не будет снято.

Что касается подхода «повторить попытку что-то сделать, пока он не сработает» в целом, это не то, с чем PHP справляется очень хорошо, поскольку обычно требуется, чтобы цикл запросов и ответов в PHP был максимально быстрым, чтобы он мог перейти к следующему запрос. Ваше PHP-приложение должно предоставлять немедленный ответ «да / нет» на внешнюю утилиту, которая запускает задачу через заданный интервал.

2

Другие решения

Я решил это так:

// This will be the testing variable, where in the actual script
// we'll check the response code of file_get_contents
$count = 0;

function funcTwo( &$count ) {

// Here I'd run file_get_contents and parse the headers
$count = ++$count;
echo "functTwo() running $count... \n";

// Here I'll test for response code 429, if true, restart
if ($count !== 5) {
echo "Count only = $count so we're gonna take a nap... \n";
sleep(1);
echo "Waking from sleep $count and rerunning myself... \n";
funcTwo($count);
return;
}

echo "Count finally = $count, exiting funcTwo... \n";

}

// This function does the main work that relies on the successful response from
function funcOne( $count ) {

echo "functOne() running! \n";

// The function will be delayed here until a successful response is returned
funcTwo($count);

echo "Count finally = $count, so now we can finally do the work that \n";
echo "depends on a successful response from funcTwo() \n";

// Do main work

echo "Work done, exiting funcOne and script... \n";

}

funcOne($count);
0

По вопросам рекламы [email protected]