Если какое-то условие выполнено, как я могу сделать функцию:
Будет ли это что-то вроде:
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)
снова. Это плохая практика как-то?
При ограниченных по скорости ресурсах вы обычно хотите кэшировать копию данных для блоков по X минут, чтобы ограничение никогда не превышалось. Например, в случае максимум 10 запросов в час вы должны кэшировать ответ в течение как минимум 6 минут, прежде чем пытаться получить новый ответ.
Не стоит останавливать весь интерпретатор PHP до тех пор, пока ограничение не будет снято.
Что касается подхода «повторить попытку что-то сделать, пока он не сработает» в целом, это не то, с чем PHP справляется очень хорошо, поскольку обычно требуется, чтобы цикл запросов и ответов в PHP был максимально быстрым, чтобы он мог перейти к следующему запрос. Ваше PHP-приложение должно предоставлять немедленный ответ «да / нет» на внешнюю утилиту, которая запускает задачу через заданный интервал.
Я решил это так:
// 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);