用途が見つかる1つの場所はdelayを作成することです。
リモートページを取得するためにcurl
/file_get_contents
を使用するクローラーを構築したとします。これで、リモートサーバーに短時間で大量の要求をぶつけたくありません。したがって、連続するリクエストの間に遅延を導入します。
sleep
は引数を秒単位で取り、そのフレンドusleep
は引数をマイクロ秒単位で取り、場合によってはより適切です。
別の例:リソースを大量に使用するある種のバッチプロセスを実行しているとします。多分あなたは9,000,000冊の本のタイトルのデータベースを歩いていて、それらの約10%を更新しているでしょう。そのプロセスは1日の途中で実行する必要がありますが、バッチプログラムを実行するとデータベースサーバーが他のユーザーのクロールまでドラッグダウンするほどの多くの更新が行われます。
したがって、バッチプロセスを変更して、たとえば1000件の更新を送信し、次にsleep
を5秒間実行して、データベースサーバーに、バックアップした他のユーザーからの要求の処理を完了する機会を与えます。
これは、私のプロジェクトの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マップによってブロックされるのを防ぐのに役立ちます。
古い質問ですが、u/sleepを使用するもう1つの理由は、認証スクリプトなどのセキュリティ/暗号化コードを作成している場合です。いくつかの例:
[〜#〜]編集[〜#〜]
タイミング攻撃に対してu/sleepを使用することは良い解決策ではありません。タイミング攻撃で重要なデータを取得することはできますが、u/sleepが追加するノイズをフィルターで除去するためのサンプルがさらに必要です。
このトピックの詳細については、次を参照してください。 ランダムスリープでタイミング攻撃を防ぐことができますか?
最近、GoogleのGeolocation APIを利用していたときに使用する必要がありました。ループ内のすべてのアドレスはGoogleのサーバーを呼び出す必要があったため、応答を受信するのに少し時間がかかりました。私はusleep(500000)
を使用して、関係するすべてに十分な時間を与えました。
とても古い投稿ですが、私もコメントしたいと思いました。私は最近、いくつかのファイルを作成した非常に長時間実行されているプロセスを確認する必要がありました。そこで、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分ごとにもっと頻繁にcronjobを実行したい場合。これには次のコードを使用します。
sleep(30);
include 'cronjob.php';
私はこのファイルとcronjob.phpを毎分呼び出します。
スリープを使用してスクリプトの実行を一時停止できます。たとえば、サーバー側で[〜#〜] ajax [〜#〜]呼び出しを遅延させることができますまたはオブザーバーを実装します。これを使用して遅延をシミュレートすることもできます。
Sendmail()とcoを遅らせるためにも使用します。 。
DoSとログインブルートフォースを防止するために、sleep()を使用している人がいます。ユーザーが複数回実行するのを防ぐためにいくつかのチェックを追加する必要があるため、同意しません。
sleep も確認してください。
通常はWebページの提供には使用しませんが、コマンドラインスクリプトには役立ちます。
$ready = false;
do {
$ready = some_monitor_function();
sleep(2);
} while (!$ready);
これは少し奇妙なケースです...ファイル転送スロットル。
昔実行したファイル転送サービスでは、ファイルは10Mbpsのアップリンクサーバーから提供されていました。ネットワークがダウンするのを防ぐために、ダウンロードスクリプトは一度にダウンロードしているユーザー数を追跡し、ユーザーごとに1秒あたりに送信できるバイト数を計算しました。それはこの量の一部を送信し、次に少しの間(1/4秒、と思う)スリープしてから、さらに送信します...など。
このように、サーバーは約9.5Mbpsで継続的に実行され、アップリンクの飽和の問題は発生せず、ダウンロードの速度は常に動的に調整されました。
私はこの方法で、またはPHPでは今はそれをしません...しかし、それは当時はうまくいきました。
そのアプリケーションの1つは、スクリプトを使用して100人以上の顧客にメールを送信している場合、この操作には最大1〜2秒かかるため、hotmailやyahooなどのほとんどのWebサイトはこれをスパムと見なすため、これを回避するために使用する必要があります。メールごとに実行がいくらか遅れる。
特に、非同期リクエスト(AJAX呼び出し、遅延画像読み込みなど)を行うWebアプリケーションをテストしています。
ローカルでテストしているため、ユーザー(自分)は1人しかいないため、ネットワークの遅延はなく、応答は即時に行われます。
sleep
を使用すると、ロードおよびネットワークによってリクエストに遅延が発生した場合のWebアプリの動作を確認/テストできます。
1つのイベントで数百万のアラートメールを受け取りたくないが、スクリプトを実行し続けたい場合の簡単な疑似コードの例。
if CheckSystemCPU() > 95
SendMeAnEmail()
sleep(1800)
fi