2016-07-28 113 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,這會不會很糟糕? –

相關問題