PHP には、JS の setInterval や setTimeout のようなネイティブのタイマー関連関数がありません。ただし、declare を使用するなど、他の方法でも実行できます。では、declare の使い方を紹介しましょう。
まず、宣言の実装方法を見てから、declare 式が何であるかを学びましょう。
function do_tick($str = '') { list($sec, $usec) = explode(' ', microtime()); printf("[%.4f] Tick.%s\n", $sec + $usec, $str); } register_tick_function('do_tick'); do_tick('--start--'); declare (ticks = 1) { while (1) { sleep(1); // 这里,每执行一次就去调用一次do_tick() } }
これは、実行後に現在時刻を毎秒出力する非常に単純なコードです。
declare 構文は次のように定義されます。
declare (directive) statemaent;
declare 構造は、コードの一部の実行命令を設定するために使用されます
directive 部分 宣言スニペットの動作を設定できます。現在知られている命令は、ティックとエンコーディングの 2 つだけです。
ティック (クロック サイクル) は、インタプリタが宣言でタイミングを計ることができる N 個の低レベル ステートメントを実行するたびに発生するイベントです。コードセグメント。 N の値は、declare のディレクティブ部分の Nicks=N で指定します。
各ティックで発生するイベントは、 register_tick_function()
ここではダニの使用のみを研究します。
上記のコードでは、 register_tick_function() を使用してティックの do_tick() メソッドを登録し、宣言で Nicks=1 を指定します。これは、時間を計測できる低レベルのステートメントが実行されるたびに、 register_tick_function()が実行される登録方法です。宣言コード ブロック内の while が毎回ループする場合、1 秒間停止する sleep() があり、この sleep() は時間を計測できる低レベルのステートメントです。
つまり、while() は時間を計測できる低レベルのステートメントではないでしょうか? where や if などの条件判断は、時間を計測できるような低レベルのステートメントではありません。
すべてのステートメントで時間を測定できるわけではありません。通常、条件式とパラメータ式は時間指定できません。
次の例を使用して、宣言を実行する方法を段階的に見てみましょう:
function test_tick() { static $i = 0; echo 'test_tick:' . $i++, PHP_EOL; } register_tick_function('test_tick'); test_tick(); // test_tick:0 $j = 0; declare (ticks = 1) { $j++; // test_tick:1 $j++; // test_tick: 2 sleep(1); // 停1秒后,test_tick:3 $j++; // test_tick:4 if ($j == 3) { // 条件表达式,不会执行ticks echo "aa", PHP_EOL; // test_tick:5 \n test_tick:6,PHP_EOL会计一次ticks } } // declare使用花括号后面所有代码无效果,作用域限定在花括号以内 echo "bbb"; // echo "ccc"; // echo "ddd"; //
コメントは非常に詳細なので、1 つずつ説明する必要はありません。ティックを 2 に設定し、宣言下のステートメントに中括弧を使用しなかった結果を見てみましょう。
function test_tick1() { static $i = 0; echo 'test_tick1:' . $i++, PHP_EOL; } register_tick_function('test_tick1'); $j = 0; // 此处不计时 declare (ticks = 2); $j++; // test_tick1:0 $j++; sleep(1); // 停1秒后 test_tick1:1 $j++; $j++; // test_tick1:2 if ($j == 4) { // 条件表达式,不会执行ticks // echo "aa", PHP_EOL; echo "aa"; // test_tick:10,test_tick1不执行,没有跳两步,如果用了,PHP_EOL,那么算两步,会输出test_tick1:3 } // declare没有使用花括号将对后面所有代码起效果,如果是require或者include将不会对父页面后续内容进行处理 echo "bbb"; // test_tick1:3 echo "ccc"; echo "ddd"; // test_tick1:4
この宣言が、その定義の後続のコードに影響を与えていることがわかりますが、実際にはそうではありません。ネストされたページがある場合、親ページの後続のコードは効果がないことに注意してください。 Nicks=2 を定義した後、 register_tick_function() によって登録された関数コードは、2 つの低レベル タイマー コードの後に 1 回実行されます。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/PHP%E6%B2%A1%E6%9C%89%E5%AE%9A%E6%97%B6%E5%99%A8%EF%BC%9F.php
推奨学習: php ビデオ チュートリアル
以上がPHPでタイマー効果を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。