web-dev-qa-db-ja.com

PHPのsetTimeout()(JavaScript)に似た関数はありますか?

質問の種類はそれをすべて言っています-JavaScript関数と同じことをする関数がありますsetTimeout() for[〜#〜] php [〜#〜]php.netを検索しましたが、見つからないようです...

25
Latze

現在のスクリプト内のコードの一部の実行を遅らせる方法はありません。 PHPスクリプトの処理は完全にサーバー側で行われ、スクリプトの全体的な実行を遅らせるだけなので、あまり意味がありません。sleep()しかし、それは一定時間プロセスを停止するだけです。

もちろん、cronジョブなどを使用して特定の時間に実行するPHPスクリプトをスケジュールできます。

11
Pekka 웃

PHPはイベントドリブンではないため、setTimeoutはあまり意味がありません。あなたは確かにそれをまねることができ、実際、誰かが Timer class を書いているかもしれません。ただし、PHPのサーバー側でこの方法でプログラミングを開始する前に注意が必要です。

13
ars

sleep 関数があり、一定の時間スクリプトを一時停止します。

usleeptime_nanosleep および time_sleep_until

11
Artefacto

実際はそうではありませんが、 tick count function を試すことができます。

8
Robin

PHPのタイマーについて注意したいことがいくつかあります。

1)PHPのタイマーは、長時間実行されるスクリプト(デーモン、および場合によってはCLIスクリプト)で使用すると意味があります。そのためそのようなアプリケーションを開発していない場合は、タイマーは不要です

2)タイマーはブロッキングとノンブロッキングになります。sleep()を使用している場合は、指定した時間だけスクリプトがフリーズするため、ブロッキングタイマーになります。時間。多くのタスクでは、タイマーのブロックは問題ありません。たとえば、10秒ごとに統計を送信します。スクリプトをブロックしても問題ありません。

while (true) {
    sendStat();
    sleep(10);
}

3)ノンブロッキングタイマーは、websocket-serverのようなイベント駆動型アプリでのみ意味があります。そのようなアプリケーションでは、イベントはいつでも発生する可能性があります(着信接続など)。そのため、sleep()でアプリをブロックしないでください(明らかに)。この目的のために、 reactphp/event-loop のようなイベントループライブラリがあります。これにより、複数のストリームをノンブロッキング方式で処理でき、タイマー/インターバル機能もあります。

4)PHPの非ブロッキングタイムアウトが可能です。stream_select() を使用して実装できます。 =タイムアウトパラメータを使用した関数( reactphp/event-loop StreamSelectLoop :: run() での実装方法を参照)。

5)タイマーを許可するlibeventlibeveventなどのPHP extensions など)があります実装(ハードコアにしたい場合)

7
AlexM

警告:sleepコマンドでPHPプロセスがハングする、または一定時間「スリープ」することができますが、通常、ユーザーインターフェイス内に視覚的な遅延を実装します。

PHPはサーバー側の言語であるため、通常はHTMLの形式で)実行出力をWebサーバーの応答に書き込むだけです。この方法でスリープを使用すると、通常、応答が停止または遅延します。

そうは言っても、睡眠には実際的な目的がある。接続の失敗後に要求を再試行する場合など、実行を遅らせることでバックオフスキームを実装できます。一般的に、PHPでsetTimeoutを使用する必要がある場合、おそらく何か間違ったことをしていることになります。

Solution:質問に明示的に答えるには:setTimeoutには2つのパラメーターがあり、1つは実行する関数を表し、もう1つは時間(ミリ秒)を表す。次のコードは、質問の機能要件を実際に満たします。

<?php
// Build the setTimeout function.
// This is the important part.
function setTimeout($fn, $timeout){
    // sleep for $timeout milliseconds.
    sleep(($timeout/1000));
    $fn();
}

// Some example function we want to run.
function someFunctionToExecute(){
    echo 'The function executed!';
}

// This will run the function after a 3 second sleep =>
// We're using an anonymous function to wrap the function
// which we wish to execute.
setTimeout(function(){
   someFunctionToExecute();
}, 3000);
?>

上記のコードの出力は3秒の遅延で、その後に次の出力が続きます。

関数が実行されました!

3
Joseph Orlando

http://php.net/manual/en/class.evtimer.php はおそらく探しているもので、javascriptのsetIntervalと同様に、間隔を設定するときに呼び出される関数を使用できます。これはpecl拡張機能です。whm/ cpanelがある場合は、peclソフトウェア/拡張機能インストーラページから簡単にインストールできます。

この質問が2010年のものであり、evtimerクラスが2012-2013年にコーディングされ始めたことに気付いていませんでした。古い質問の更新として、javascripts settimeout/setintervalに似たこれを実行できるクラスがあります。

3
Masu

いくつかのphpコードを実行した後にアクションを実行する必要がある場合は、エコーで実行できます

 echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>";

そのため、クライアント(ブラウザ)でしばらくすると、たとえば別のphpスクリプトへのリダイレクトやアラートのエコーなど、何か他の操作を実行できます。

2
Geomorillo