-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46564
- shell命令
-
- 文章:(42)篇
- 阅读:154237
- Git教程
-
- 文章:(36)篇
- 阅读:234850
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131790
-
PHP中结构体之declare的使用2017-12-20 23:53 阅读(6513) 评论(0)
一、简介
declare在PHP中一种结构体,主要是用来设定一段代码的执行指令。 其语法接口如下:
declare (directive) statement
directive 部分允许设定 declare 代码段的行为。目前只认识两个指令:ticks和encoding。
其中:
Tick(时钟周期)是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。
在每个 tick 中出现的事件是由 register_tick_function() 来指定的,如下:
declare(ticks=1); function tick_handler() { echo "hello world \n"; } register_tick_function('tick_handler'); register_tick_function(function(){ echo 'just for test' . "\n"; });
上面程序中“declare(ticks=1);”代表,每执行一条低级语句,就触发register_tick_function中注册的函数。
encoding ,指令来对每段脚本指定其编码方式。如下
declare(encoding='ISO-8859-1'); // code here
二、declare的使用
1、限制循环运行的时间
每当触发注册的事件,就会判断当前时间与起始时间,超过20s,就结束程序。程序如下:
declare(ticks=1); $startTime = time(); function limitRunTime($startTime) { $curTime = time(); if (($curTime - $startTime) > 20) { echo "game over \n"; die; } } register_tick_function('limitRunTime', $startTime); while (true) { //some codes sleep(5); }
执行结果如下:
当然,这也会引发一个问题,也就是当while中循环体执行了一半,然后程序就被中断,可能会导致意想不到的bug,所以上面的限制循环执行时间,还是需要优化,我们需要优雅的中断程序。那么,我们首先能想到是,如下:
<?php declare(ticks=1); $isKill = false; $startTime = time(); function limitRunTime($startTime) { global $isKill; $curTime = time(); if (($curTime - $startTime) > 20) { echo "game over \n"; $isKill = true; } } register_tick_function('limitRunTime', $startTime); while (true && !$isKill) { //some codes var_dump($isKill); sleep(5); }
输出如下:
register_tick_function注册的函数里面修改了全局变量$isKill,在while循环中,检查到这种改动。
在来看一个案例:
<?php $startTime = time(); function limitRunTime($startTime) { $curTime = time(); if (($curTime - $startTime) > 5) { echo "game over \n"; die; } } register_tick_function('limitRunTime', $startTime); while (true) { //some codes echo "curTime:".time()."\n"; declare(ticks=1) { sleep(1); //last line in for } }
运行效果如下: