在 PHP 中,如何停止函数、等待并递归地重新启动自身直到满足某些条件?

In PHP, how to stop function, wait, and recursively restart itself until some condition is met?

如果满足某些条件,我该如何实现功能:

  1. 停止执行函数的其余部分
  2. 等待 X 次
  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 连接执行此操作。首先,我通过

收到一个 webhook 命中
file_get_contents('php://input')

其中包含一个URL。然后我用

打 URL
file_get_contents( $url )

并且,在将 $http_response_header 解析为 $headers 数组后,检查它的 header 是否为 if ($header['api_limit'] == 0) ...(在上面的示例中是 x)。如果 "x" 为 0,那么我希望该函数等待一分钟,直到限制循环重置,并且 运行 第二个 file_get_contents( $url ) 和再次跟随它的解析。

我想这样处理的主要原因是不需要记录任何东西。我通过 file_get_contents('php://input') 收到的 webhook 只发生一次。如果达到 API 速率限制并且我尝试在 webhook 中使用 URL 但失败了,那么 URL 就会丢失。所以我希望该函数只等待 X 时间,直到 rte 重置,直到再次尝试将 webhook-received URL 与 file_get_contents($url) 一起使用。这是某种不好的做法吗?

对于速率受限的资源,您通常希望缓存 X 分钟块的数据副本,以便实际上永远不会超过限制。例如,在每小时最多 10 个请求的情况下,您将在尝试获取新响应之前将响应缓存至少 6 分钟。

在解除速率限制之前停止整个 PHP 解释器不是一个好主意。

至于一般来说接近 "repeat an attempt to do something until it works",这不是 PHP 处理得很好的事情,因为您通常希望 PHP 的请求和响应周期尽可能快所以它可以移动到下一个请求。您的 PHP 应用程序应立即 yes/no 响应以给定时间间隔触发任务的外部实用程序。

我是这样解决的:

// 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);