在 PHP 中,如何停止函数、等待并递归地重新启动自身直到满足某些条件?
In PHP, how to stop function, wait, and recursively restart itself until some condition is met?
如果满足某些条件,我该如何实现功能:
- 停止执行函数的其余部分
- 等待 X 次
- 重启函数
会不会像这样:
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);
如果满足某些条件,我该如何实现功能:
- 停止执行函数的其余部分
- 等待 X 次
- 重启函数
会不会像这样:
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。然后我用
打 URLfile_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);