确实,PHP没有类似于JS中的setInterval或者setTimeout这样的原生定时器相关的函数。但是我们可以通过其他方式来实现,比如使用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 部分允许设定 declare 代码段的行为。目前只认识两个指令:ticks以及 encoding

Tick(时钟周期)是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的

在每个 tick 中出现的事件是由 register_tick_function() 来指定的

这里,我们只研究ticks的使用。

上述代码中,我们使用register_tick_function()注册了do_tick()方法给ticks,declare指定了ticks=1,也就是每执行一次可计时的低级语句,就会去执行一次register_tick_function()中注册的方法。当declare代码块中的while每次循环时,都有一个sleep()停顿了一秒,而这个sleep()就是那个可计时的低级语句。

那么,while()不是可计时的低级语句嘛?当然不是,where、if等条件判断都不是这种可计时的低级语句。

不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。

我们通过下面这个例子再来看看具体到一步步declare是怎样执行的:

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"; //

注释很详细了,我们就不用一一说明了。下面我们来看将ticks定为2,并且declare下面的statemaent不用花括号的结果:

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

可以看出,我们declare对其定义后续的代码都产生了作用,但需要注意的是如果有页面嵌套,对父页面的后续代码是没有效果的。而定义了ticks=2之后,将在两个低级可计时代码后执行一次register_tick_function()注册的函数代码。

===========

各自媒体平台均可搜索【硬核项目经理】

php不支持定时器么,PHP没有定时器?相关推荐

  1. c51两个定时器中断冲突_STM32定时器与中断整理

    目录 1.系统异常中断 2.外部中断(全部) 3.优先级 5.如何开关中断示例 6.抢断优先级.响应优先级说明 7.定时器说明 7.1基本定时器 7.2高级/通用定时器 7.3定时器拓展补充-主要特性 ...

  2. DSP之时钟与定时器之四看门狗定时器

    1 工作方式                在数字信号处理器的工作过程中有时会发生一些异常情况,这可能是在软件执行时发生错误,如堆栈溢出.内存溢出等软件编写时没有预料到的错误,也可能是DSP在运行时受 ...

  3. 8、TM4单片机的滴答定时器,及利用定时器精确延时

    在我们日常使用单片机的时候,延时一般采用循环的方式,但是这样的方式只能用于粗略的延时,但我们需要精准的时间控制的时候,便需要利用定时器获得精确的延时. 本次采用TM4内的滴答定时器. 文章目录 1.滴 ...

  4. STM32入门笔记04_TIM定时器+案例:TIM定时器定时中断、定时器外部时钟

    TIM定时器 TIM简介 TIM(Timer) 定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz(系统主频)计数时 ...

  5. STM32F103的11个定时器详解 高级定时器pwm

    STM32F103VC这款单片机一共有2个高级定时器TIM1和TIM8 这2个高级定时器都可以同时产生3路互补带死区时间的PWM信号和一路单独的PWM信号, 具有刹车输入功能,在紧急的情况下这个刹车功 ...

  6. jmeter定时器的使用_jmeter定时器

    jmeter提供了很多元件,帮助我们更好的完成各种场景的性能测试,其中,定时器(timer)是很重要的一个元件,最新的3.0版本jemter提供了9种定时器(之前6种),下面一一介绍: 一.定时器的作 ...

  7. stm32定时器中断_stm32F4之定时器的基本使用

    概述 上一篇说了stm32F4GPIO的使用,这篇说说定时器的使用 一. stm32F407的定时器资源介绍: ​ STM32F407有14个定时器,其中有12个16位的定时器,2个32位的定时器 这 ...

  8. c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验

    STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...

  9. stm32 定时器_如何计算STM32定时器、独立看门狗和窗口看门狗

    点击上方蓝色字体,关注我们 本博文简要阐述STM32L011微控制器定时器的参数配置(其他型号大同小异,本文侧重讲解配置,至于各类定时器的特点后续再述),STM32定时器种类繁多有通用定时器.基本定时 ...

  10. ARM(I.MX6ULL) EPIT定时器中断实验、定时器按键消抖

    参考:Linux之ARM (I.MX6ULL) EPIT定时器详解 作者:一只青木呀 发布时间: 2020-09-20 10:03:37 网址:https://blog.csdn.net/weixin ...

最新文章

  1. 【经典概念】一文详解Batch Normalization!!!
  2. 全球及中国塑料薄膜行业产销现状及投资竞争力分析报告2021版
  3. php实现贴吧功能,PHPCMS V9万能字段增加单选功能,实现多条房产信息调用1个开发商信息等效果...
  4. 福爆 | 博客升级 .NET Core 3.0 又踩一坑
  5. php调用airtestide,raw device
  6. 黑客恶意修改化学成分参数,远程投毒饮用水
  7. 不会写漂亮代码不是优秀的程序员,没有钢铁侠之躯不是合格的程序员
  8. SharePoint 2010 中型场(Farm)——性能研究(来自DeLL技术中心博客)
  9. c语言某字符未定义,学习(单片机C语言程序设计实训100例)遇到问题 未定义的标识符 请教解决办法!...
  10. 小爱同学指令大全_小爱同学有趣的命令分享给大家
  11. (八十三)第三方类库不支持64位处理器的解决方法
  12. 程序人生 - 车辆年检与费用你知道多少?
  13. 安霸Ambarella_海思Hisilicon_AI芯片参数对比
  14. HDU 2826 || The troubles of lmy(判断两个N边形是否相似
  15. 一寸照片多大?你知道一寸照片的尺寸吗?
  16. .then()方法的意思和用法
  17. 【R语言】ggplot2---散点图的边框和颜色填充问题
  18. 舒亦梵:4.24非农周大数据即将来临,黄金行情将是怎样
  19. java计算机毕业设计黑格伯爵国际英语贵族学校官网MyBatis+系统+LW文档+源码+调试部署
  20. B. Marvolo Gaunt’s Ring (递推)

热门文章

  1. Java技术分享:Lambda表达式之接口实例化
  2. web前端教程之JavaScript的作用域
  3. 服务器显示器切换_尼某某 DDOS 攻击高德,致使服务器处于黑洞状态 5 个多小时:被判 16 个月...
  4. 1万条数据大概占多大空间_9月漫画数据月报丨多平台评论数,收藏数较上月大幅下降...
  5. linux打开dc软件,Linux bc/dc命令的初步使用
  6. Django框架(15.Django中的自关联)
  7. 贪心算法讲解(集合覆盖问题,旅行商问题求解)
  8. python打包成exe 可执行文件 。教程
  9. 情感分析(支持向量机,逻辑回归)
  10. HTTP 协议 Host 请求头的作用