ホームページ > バックエンド開発 > PHPの問題 > PHPでタイマー効果を実装する方法

PHPでタイマー効果を実装する方法

醉折花枝作酒筹
リリース: 2023-03-10 21:52:01
転載
2898 人が閲覧しました

PHP には、JS の setInterval や setTimeout のようなネイティブのタイマー関連関数がありません。ただし、declare を使用するなど、他の方法でも実行できます。では、declare の使い方を紹介しましょう。

PHPでタイマー効果を実装する方法

まず、宣言の実装方法を見てから、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 サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート