• 你好!欢迎你的到来
  • 关于我们
  • 首页 博客 学习笔记 技术导航 工具
  • 博文分类
    • PHP(43)
    • MySQL(11)
    • Linux(28)
    • html(3)
    • JQuery(4)
    • JavaScript(9)
    • svn(2)
    • CSS(2)
    • seajs(1)
    • go(44)
    • redis(1)
    • nginx(8)
    • mongo(0)
    • java(0)
    • 算法(0)
    • 其他(26)
    • 生活(1)
    专栏
    • Jquery基础教程
      • 文章:(15)篇
      • 阅读:33315
    • shell命令
      • 文章:(42)篇
      • 阅读:108620
    • Git教程
      • 文章:(36)篇
      • 阅读:179632
    • leetCode刷题
      • 文章:(76)篇
      • 阅读:64008
    • 摘要视图
    • 目录视图
    PHP中结构体之declare的使用
    标签: declaretick
    2017-12-20 23:53 阅读(4665) 评论(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
    	}
    }

    运行效果如下:


    本文为原创文章,请尊重辛勤劳动,如需转载,请保留本文地址
    http://www.findme.wang/blog/detail/id/299.html

    若您感觉本站文章不错,读后有收获,不妨赞助一下?

    我要赞助

    您还可以分享给朋友哦

    更多
    顶
    1
    踩
    0
    • 上一篇: PHP中多进程控制之pcntl扩展详解
    • 下一篇: Mysql时间戳与时间格式转换问题汇总
    • 查看评论
    • 正在加载中...
    • 留言
    • 亲,您还没有登录,登录后留言不需要审核哦!
      可以使用如下方式登录哦!
  • CSDN | 新浪微博 | github | 关于我们 | 我要留言 | 友链申请
  • 豫ICP备18038193号    Copyright ©lidequan All Rights Reserved