52

のドキュメントを見ただけsleep()です。

この関数をどこで使用しますか?

高価な機能でCPUに休憩を与えるためにありますか?

よくある落とし穴は?

4

13 に答える 13

51

それが使用される 1 つの場所は、遅延を作成することです。

curl/file_get_contentsを使用してリモート ページを取得するクローラーを作成したとします。短時間にあまりにも多くのリクエストをリモート サーバーに送信するのは望ましくありません。したがって、連続するリクエスト間に遅延が発生します。

sleep秒単位で引数を取り、そのフレンドusleepはマイクロ秒単位で引数を取り、場合によってはより適切です。

于 2010-10-14T06:53:07.033 に答える
33

別の例: リソースを大量に使用するある種のバッチ プロセスを実行しています。おそらく、9,000,000 本のタイトルのデータベースを調べて、そのうちの約 10% を更新しているとします。そのプロセスは日中に実行する必要がありますが、実行する更新が非常に多いため、バッチ プログラムを実行すると、データベース サーバーが他のユーザーのクロールに引きずり込まれます。

したがって、たとえば 1000 件の更新を送信するようにバッチ プロセスを変更し、その後sleep5 秒間、バックアップした他のユーザーからの要求の処理を完了する機会をデータベース サーバーに与えます。

于 2010-10-15T03:45:55.020 に答える
25

これが私のプロジェクトの1つでどのように使用するかのスニペットですsleep

foreach($addresses as $address)
{
  $url = "http://maps.google.com/maps/geo?q={$address}&output=json...etc...";
  $result = file_get_contents($url);
  $geo = json_decode($result, TRUE);

  // Do stuff with $geo

  sleep(1);
}

この場合sleep、サーバーに送信するリクエストが多すぎるため、Googleマップによってブロックされるのを防ぐのに役立ちます。

于 2010-10-14T06:58:53.920 に答える
10

古い質問ですが、u/sleep を使用するもう 1 つの理由は、認証スクリプトなどのセキュリティ/暗号化コードを記述している場合です。いくつかの例:

  1. ログイン スクリプトを故意に遅くすることで、ブルート フォース攻撃の可能性を減らしたいと思うかもしれません。
  2. また、タイミング攻撃を軽減するために、暗号化中に人為的な遅延を追加することもできます。PHP のような言語でこのような詳細な暗号化コードを作成する可能性は低いことはわかっていますが、それでも有効だと思います。

編集

タイミング攻撃に対して u/sleep を使用することは、良い解決策ではありません。タイミング攻撃で重要なデータを取得することはできますが、u/sleep が追加するノイズをフィルター処理するためにより多くのサンプルが必要なだけです。

このトピックの詳細については、「ランダム スリープでタイミング攻撃を防ぐことができますか?」を参照してください。

于 2013-10-19T20:58:00.697 に答える
1

スリープを使用してスクリプトの実行を一時停止できます...たとえば、サーバー側によるAJAX呼び出しを遅らせたり、オブザーバーを実装したりできます。また、遅延をシミュレートするために使用することもできます。

sendmail()&coを遅らせるためにもそれを使用します。。

誰かがsleep()を使用してDoSを防止し、brutefocesにログインすることに同意しません。これは、ユーザーが複数回実行されないようにチェックを追加する必要があるためです。

usleepも確認してください。

于 2010-10-14T07:02:45.143 に答える
1

通常、Web ページの提供には使用しませんが、コマンド ライン スクリプトには便利です。

$ready = false;
do {
  $ready = some_monitor_function();
  sleep(2);
} while (!$ready);
于 2012-12-13T19:59:22.750 に答える
1

超古い投稿ですが、私もコメントしようと思いました。最近、いくつかのファイルを作成する非常に長時間実行されているプロセスを確認する必要がありました。そこで、cURL 関数を反復処理する関数を作成しました。探しているファイルが存在しない場合は、php ファイルをスリープ状態にして、もう一度確認します。

function remoteFileExists() {
    $curl = curl_init('domain.com/file.ext');

    //don't fetch the actual page, you only want to check the connection is ok
    curl_setopt($curl, CURLOPT_NOBODY, true);

    //do request
    $result = curl_exec($curl);

    //if request did not fail
    if ($result !== false) {
        //if request was ok, check response code
        $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

        if ($statusCode == 404) {
              sleep(7);
              remoteFileExists();
        }
        else{
            echo 'exists'; 
        }
    }

    curl_close($curl);

}

echo remoteFileExists();
于 2013-08-17T07:43:16.800 に答える
1

それを使用する別の方法: 毎分より頻繁に cronjob を実行したい場合。これには次のコードを使用します。

sleep(30);
include 'cronjob.php';

このファイルと cronjob.php を毎分呼び出します。

于 2016-12-06T19:54:04.670 に答える
0

そのアプリケーションの 1 つは、スクリプトを使用して 100 人以上の顧客にメールを送信する場合、この操作に最大 1 ~ 2 秒かかるため、hotmail や yahoo などのほとんどの Web サイトがスパムと見なすため、これを回避するために使用する必要があります。メールのたびに実行が遅れます。

于 2014-09-19T13:17:08.157 に答える
0

とりわけ、非同期リクエストを行う Web アプリケーションをテストしています (AJAX 呼び出し、遅延画像読み込みなど)。

ローカルでテストしているため、ユーザー (あなた) は 1 人だけであり、ネットワークの遅延がないため、応答は即時です。

を使用sleepすると、負荷とネットワークによってリクエストの遅延が発生した場合に Web アプリがどのように動作するかを確認/テストできます。

于 2016-10-25T19:10:06.233 に答える