> 백엔드 개발 > PHP 문제 > PHP에서 타이머 효과를 구현하는 방법

PHP에서 타이머 효과를 구현하는 방법

醉折花枝作酒筹
풀어 주다: 2023-03-10 21:52:01
앞으로
2927명이 탐색했습니다.

PHP에는 JS의 setInterval 또는 setTimeout과 유사한 기본 타이머 관련 기능이 없습니다. 하지만 선언을 사용하는 등 다른 방법으로 이를 수행할 수 있습니다. 다음으로 에디터가 선언의 사용법을 소개하겠습니다

PHP에서 타이머 효과를 구현하는 방법

우선 어떻게 구현되는지 살펴보고 선언 표현식이 무엇인지 알아보겠습니다.

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()
    }
}
로그인 후 복사

실행 후 1초마다 현재 시간을 출력하는 매우 간단한 코드입니다.

declare 구문은 다음과 같이 정의됩니다.

declare (directive)
    statemaent;
로그인 후 복사
  • 선언 구조는 코드 조각의 실행 지침을 설정하는 데 사용됩니다.

  • 지시문 부분을 사용하면 선언 코드 세그먼트의 동작을 설정할 수 있습니다. 현재 알려진 명령은 틱과 인코딩 두 가지뿐입니다. 틱(클럭 주기)은 인터프리터가 선언 코드 세그먼트에서 N개의 시간 지정 하위 수준 명령문을 실행할 때마다 발생하는 이벤트입니다. N의 값은 선언의 지시문 부분에서 Ticks=N으로 지정됩니다. 각 Tick에서 발생하는 이벤트는 Register_tick_function()에 의해 지정됩니다. 여기서는 Tick의 사용만 연구합니다.

  • 위 코드에서 우리는 틱에 대한 do_tick() 메서드를 등록하기 위해 Register_tick_function()을 사용하고 선언은 틱=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"; //
    로그인 후 복사
  • 댓글이 매우 자세해서 일일이 설명할 필요가 없습니다. 틱을 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
로그인 후 복사

선언이 이를 정의하는 후속 코드에 영향을 미치는 것을 볼 수 있지만, 주의해야 할 점은 다음과 같습니다. 페이지에 포함된 세트가 있는 경우 상위 페이지의 후속 코드에는 영향을 미치지 않습니다. Ticks=2를 정의한 후, Register_tick_function()에 의해 등록된 함수 코드는 두 개의 하위 수준 타이머 코드 다음에 한 번 실행됩니다.

테스트 코드:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿