2016-07-28 107 views
0

如果某些条件得到满足,我怎样才能使函数:在PHP中,如何停止函数,等待并递归地重启自身,直到满足某些条件?

  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阵列后,检查它的头作为if ($header['api_limit'] == 0) ...(在上面的示例中,这是x)。如果为0,那么我希望函数等待一分钟,直到极限周期重置并运行第二个file_get_contents($url)及其后的解析。

我想以这种方式处理它的主要原因是不必记录任何东西。我通过file_get_contents('php://input')收到的webhook只会发生一次。如果API速率限制被击中,并且我试图在webhook中使用该URL但失败,则该URL将丢失。所以我希望这个函数只需要等待X时间直到rte重新设置,直到试图再次使用webhook接收到的URL为file_get_contents($url)。不知何故,这是不好的做法?

+0

至于反对建立一个逻辑存储和cron处理脚本? –

+0

这听起来很粗糙,有点复杂,不是吗?我建议记忆不好还是出于其他原因? –

+0

我想以这种方式处理它的主要原因是不必记录任何东西。我通过'file_get_contents('php:// input')'接收的webhook只会发生一次。如果API速率限制被击中,并且我试图在webhook中使用该URL但失败,则该URL将丢失。所以我希望这个函数会等待X时间,直到rte重新设置,直到试图再次使用带有'file_get_contents($ url)'的webhook接收的URL。不知何故,这是不好的做法? –

回答

0

我解决了它这样的:

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

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

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

至于接近“重复尝试做一些事情,直到它工作”一般来说,这不是PHP处理得很好的事情,因为您通常希望PHP的请求和响应循环尽可能快,以便它可以转到下一个请求。您的PHP应用程序应该立即提供是否响应以特定间隔触发任务的外部实用程序。

+0

等一下,你的意思是如果一个webhook在'http:/api.myserver.com/ parser-script.php'命中某个脚本,并且如果这个脚本执行被sleep();或者递归阻塞了,那么在第一个脚本初始化完成之前它不能接收另一个webhook? –

+1

@AndreBulatov你可以得到关于特定查询的更多信息[这里](http://stackoverflow.com/questions/1430883/simultaneous-requests-to-php-script)。从我的观点来看,最值得注意的是来自同一客户端的*请求排队*,因此,无论您用于等待速率限制的客户端是否会成功与PHP应用程序的其他部分交互。 – Marty

+0

啊,所以首先回答是“WordPress,doh!”但在这种情况下,客户是什么?这是超级启发,但它似乎并没有真正构成我的方法的障碍。我只会每天收到大约100-200 webhook,大部分时间在1小时内,大约在上午11点左右。费率限制是每分钟40。因此,它将解析40,在队列中任何其他传入POST时挂起,一旦限制被重置,它将执行相同的一两次,然后完成。如果我可以预测脚本的一小部分POST,这会不会很糟糕? –

相关问题