web-dev-qa-db-ja.com

PHPのsleep()の実用的な用途は何ですか?

sleep() のドキュメントを確認しました。

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

高価な機能でCPUを中断することはありますか?

一般的な落とし穴はありますか?

49
alex

用途が見つかる1つの場所はdelayを作成することです。

リモートページを取得するためにcurl/file_get_contentsを使用するクローラーを構築したとします。これで、リモートサーバーに短時間で大量の要求をぶつけたくありません。したがって、連続するリクエストの間に遅延を導入します。

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

47
codaddict

別の例:リソースを大量に使用するある種のバッチプロセスを実行しているとします。多分あなたは9,000,000冊の本のタイトルのデータベースを歩いていて、それらの約10%を更新しているでしょう。そのプロセスは1日の途中で実行する必要がありますが、バッチプログラムを実行するとデータベースサーバーが他のユーザーのクロールまでドラッグダウンするほどの多くの更新が行われます。

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

27
Andy Lester

これは、私のプロジェクトの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マップによってブロックされるのを防ぐのに役立ちます。

23
Mischa

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

  1. 特に数回の試行が失敗した後、ログインスクリプトを意図的に遅くすることにより、潜在的なブルートフォース攻撃の有効性を減らすことができます。
  2. また、暗号化中に人為的な遅延を追加して、 タイミング攻撃 を軽減することもできます。 PHPのような言語でこのような詳細な暗号化コードを作成する可能性はごくわずかですが、それでも妥当だと思います。

[〜#〜]編集[〜#〜]

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

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

9
Angry Dan

最近、GoogleのGeolocation APIを利用していたときに使用する必要がありました。ループ内のすべてのアドレスはGoogleのサーバーを呼び出す必要があったため、応答を受信するのに少し時間がかかりました。私はusleep(500000)を使用して、関係するすべてに十分な時間を与えました。

1
hohner

とても古い投稿ですが、私もコメントしたいと思いました。私は最近、いくつかのファイルを作成した非常に長時間実行されているプロセスを確認する必要がありました。そこで、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();
1
David

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

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

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

1
Tom

スリープを使用してスクリプトの実行を一時停止できます。たとえば、サーバー側で[〜#〜] ajax [〜#〜]呼び出しを遅延させることができますまたはオブザーバーを実装します。これを使用して遅延をシミュレートすることもできます。

Sendmail()とcoを遅らせるためにも使用します。 。

DoSとログインブルートフォースを防止するために、sleep()を使用している人がいます。ユーザーが複数回実行するのを防ぐためにいくつかのチェックを追加する必要があるため、同意しません。

sleep も確認してください。

1
Fabio Mora

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

$ready = false;
do {
  $ready = some_monitor_function();
  sleep(2);
} while (!$ready);
1
Octopus

これは少し奇妙なケースです...ファイル転送スロットル。

昔実行したファイル転送サービスでは、ファイルは10Mbpsのアップリンクサーバーから提供されていました。ネットワークがダウンするのを防ぐために、ダウンロードスクリプトは一度にダウンロードしているユーザー数を追跡し、ユーザーごとに1秒あたりに送信できるバイト数を計算しました。それはこの量の一部を送信し、次に少しの間(1/4秒、と思う)スリープしてから、さらに送信します...など。

このように、サーバーは約9.5Mbpsで継続的に実行され、アップリンクの飽和の問題は発生せず、ダウンロードの速度は常に動的に調整されました。

私はこの方法で、またはPHPでは今はそれをしません...しかし、それは当時はうまくいきました。

1
XediDC

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

0
HARISH THAKUR

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

ローカルでテストしているため、ユーザー(自分)は1人しかいないため、ネットワークの遅延はなく、応答は即時に行われます。

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

0
Paolo

1つのイベントで数百万のアラートメールを受け取りたくないが、スクリプトを実行し続けたい場合の簡単な疑似コードの例。

  if CheckSystemCPU() > 95  
        SendMeAnEmail()
        sleep(1800)
  fi
0
Mike Q