确实,PHP并没有原生的定时器相关的函数,比如JS中的setInterval或者setTimeout。但是我们可以通过其他方式来实现,比如使用declare。我们先来看看它是如何实现的,然后再了解一下declare表达式是什么。functiondo_tick($str=''){list($sec,$usec)=explode('',microtime());printf("[%.4f]Tick.%s\n",$sec+$usec,$str);}register_tick_function('do_tick');do_tick('--start--');声明(ticks=1){而(1){睡眠(1);//这里,每执行一次就调用一次do_tick()}}很简单的代码,运行后,会每秒输出一次当前时间。declare语法的定义如下:declare(directive)statemaent;declare结构体用于设置一段代码的执行指令。指令部分允许设置声明代码部分的行为。目前只识别两条指令:ticks和encodingTick(时钟周期)是解释器每次在declare代码段执行N条timeable低级语句时发生的事件。N的值在declare的指令部分由ticks=N指定,每个tick出现的事件由register_tick_function()指定,这里我们只研究ticks的使用。上面代码中,我们使用register_tick_function()注册了ticks的do_tick()方法,declare指定ticks=1,即每次执行一个可以定时的底层语句时,注册在register_tick_function()将被执行一次。declare代码块中的while每次循环的时候,都有一个sleep()暂停一秒,这个sleep()就是可以定时的低级语句。那么,while()不就是一个可以定时的低级语句吗?当然不是,where、if之类的条件判断,不是那种可以定时的低级语句。并非所有陈述都是定时的。通常条件表达式和参数表达式是不定时的。下面通过例子来看看declare是如何一步步执行的:functiontest_tick(){static$i=0;回声'test_tick:'。$i++,PHP_EOL;}register_tick_function('test_tick');test_tick();//test_tick:0$j=0;声明(ticks=1){$j++;//test_tick:1$j++;//test_tick:2睡眠(1);//1秒后,test_tick:3$j++;//test_tick:4if($j==3){//条件表达式,ticks不会被执行echo"aa",PHP_EOL;//test_tick:5\ntest_tick:6,PHP_EOL算一个tick}}//declare花括号后面的所有代码都没有作用,作用域仅限于花括号echo"bbb";//回显"ccc";//echo"ddd";//注释已经很详细了,我们就不用一一解释了。让我们看看将ticks设置为2并且不对下面的声明使用花括号的结果:functiontest_tick1(){static$i=0;回声'test_tick1:'。$i++,PHP_EOL;}register_tick_function('test_tick1');$j=0;//这里没有计时declare(ticks=2);$j++;//test_tick1:0$j++;睡觉(1);//1秒后停止test_tick1:1$j++;$j++;//test_tick1:2if($j==4){//条件表达式,报价不会被执行//echo"aa",PHP_EOL;回声“aa”;//test_tick:10,test_tick1不会执行,不跳两步,如果使用,PHP_EOL,再两步,会输出test_tick1:3}//declare不使用花括号,会影响后面的所有代码,如果是require或include,则不处理父页面的后续内容echo"bbb";//test_tick1:3echo"ccc";echo"ddd";//test_tick1:4,可见我们的declare对其定义的后续代码有影响,但需要注意的是,如果有页面嵌套,则对父页面的后续代码没有影响。定义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参考文档:https://www.php.net/manual/zh/control-structures.declare.php===========各媒体平台均可搜索【硬核项目经理】
