2016-07-28 1 views
0

いくつかの条件が満たされた場合、どのように私は機能を行うことができます。関数の残りの部分 PHPでは、何らかの条件が満たされるまで、機能を停止し、待機し、再帰的に再起動する方法はありますか?

  • 待機X時間
  • 再起動を実行

    1. ストップ機能

    はそれがものになるだろうlike:

    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を含むウェブフックのヒットを受け取ります。私は

    file_get_contents($url) 
    

    とURLを打つと、$headers配列に$http_response_headerを解析した後、それは(これはxである上記の例では)if ($header['api_limit'] == 0) ...ようにヘッダーのチェック。 "x"が0の場合、リミットサイクルがリセットされ、2番目のfile_get_contents($url)とそれに続く解析を再び実行するまで、関数は1分待つ必要があります。

    私がこのように扱いたい主な理由は、何も記録する必要がないことです。私がfile_get_contents('php://input')で受け取ったwebhookは一度しか起こりません。 APIのレート制限に達した場合、ウェブフックでURLを使用しようとしましたが失敗すると、URLは失われます。だから私は機能がちょうどfile_get_contents($url)とwebhook受信URLを使用しようとするまで、rteがリセットされるまでX時間を待つことを望んでいた。この悪い習慣はどういうわけか?

  • +0

    ? –

    +0

    これは荒くて複雑な音ですね。私は方法が私に悪い記憶を賢明に示唆していますか他の何らかの理由でですか? –

    +0

    私がこのように扱いたい主な理由は、何も記録する必要がないことです。 'file_get_contents( 'php:// input')を介して受け取ったwebhookは一度しか起こりません。 APIのレート制限に達した場合、ウェブフックでURLを使用しようとしましたが失敗すると、URLは失われます。だから私は関数が 'file_get_contents($ url)'でwebhookで受信したURLを再び使用しようとするまで、rteがリセットされるまでXタイムを待つことを望んでいました。この悪い習慣はどういうわけか? –

    答えて

    0

    私はこのようにそれを解決:論理ストレージとcron処理スクリプトを設定するとは対照的に

    // 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分のブロックのデータのコピーをキャッシュします。たとえば、1時間あたり最大10件のリクエストの場合、新しいレスポンスを取得する前に少なくとも6分間レスポンスをキャッシュします。

    レート制限が解除されるまで、PHPインタプリタ全体を停止することはお勧めできません。

    一般的に「動作するまで何かをやり直してください」と近づくにつれ、これはPHPが非常にうまく処理するものではありません。次のリクエストに移動します。 PHPアプリケーションは、所定の間隔でタスクをトリガする外部ユーティリティに対して、即時のyes/noレスポンスを提供する必要があります。

    +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!"です。しかし、この場合のクライアントは何ですか?これは超啓発ですが、実際に私の方法には障害をもたらさないようです。私は1日に約100-200のwebhookを受け取ります。ほとんどの場合、1時間以内に、午前11時ぐらいです。レート制限は1分あたり40です。それで、それは40を解析し、他の受信したPOSTを待ち行列に入れたままハングします。リミットがリセットされると、同じ1〜2回同じことが行われ、完了します。私がスクリプトに少数のPOSTを予期することができれば、これは悪いことでしょうか? –

    関連する問題