一般用法是 declare(ticks=N);拿declare(ticks=1)来说,这句主要作用有两种:

  1、Zend引擎每执行1条低级语句就去执行一次 register_tick_function() 注册的函数。可以粗略的理解为每执行一句php代码(例如:$num=1;)就去执行下已经注册的tick函数。 一个用途就是控制某段代码执行时间,例如下面的代码虽然最后有个死循环,但是执行时间不会超过5秒。运行 php timeout.php

 <?php
declare(ticks=1); // 开始时间
$time_start = time(); // 检查是否已经超时
function check_timeout(){
// 开始时间
global $time_start;
// 5秒超时
$timeout = 5;
if(time()-$time_start > $timeout){
exit("超时{$timeout}秒\n");
}
} // Zend引擎每执行一次低级语句就执行一下check_timeout
register_tick_function('check_timeout'); // 模拟一段耗时的业务逻辑
while(1){
$num = 1;
} // 模拟一段耗时的业务逻辑,虽然是死循环,但是执行时间不会超过$timeout=5秒
while(1){
$num = 1;
}

  2、declare(ticks=1);每执行一次低级语句会检查一次该进程是否有未处理过的信号,测试代码如下:

 <?php
declare(ticks = 1); //每执行一次低级语句会检查一次该进程是否有未处理过的信号, //利用计时器发送一个SIGALRM信号
function signal_handler($signal){
print "Caught SIGALRM\n";
pcntl_alarm(5);
} pcntl_signal(SIGALRM, "signal_handler");
pcntl_alarm(5); while (1){
sleep(1);
}

  当然declare的效率是极低的,比较好的做法是去掉ticks,转而使用pcntl_signal_dispatch,在代码循环中自行处理信号. 具体参考:http://rango.swoole.com/archives/364

  优化上述例子:

 <?php
//declare(ticks = 1); //每执行一次低级语句会检查一次该进程是否有未处理过的信号,效率太低 //利用计时器发送一个SIGALRM信号
function signal_handler($signal){
print "Caught SIGALRM\n";
pcntl_alarm(5);
} pcntl_signal(SIGALRM, "signal_handler");
//5秒后发送信号
pcntl_alarm(5); while (1){
pcntl_signal_dispatch();
sleep(1);
}

  参考:http://blog.csdn.net/udefined/article/details/24333333

      http://rango.swoole.com/archives/364    

PHP declare(ticks=N); 的作用的更多相关文章

  1. PHP进程之信号捕捉中的declare(ticks=1)

    转自:http://blog.csdn.net/gavin_new/article/details/65629223 一. 语句在php中的意义 php中,declare(ticks=n)和regis ...

  2. php declare (ticks = N)

    A tick is an event that occurs for every N low-level tickable statements executed by the parser with ...

  3. [PHP]PHP中申明 declare(strict_types=1)的作用

    strict_types=1 针对参数类型开启严格模式,进行数据类型检验,默认是弱类型校验哪个文件写了declare,哪个文件中的所有代码就需要检查 declare(strict_types=1); ...

  4. php socket 编程问题总结

    1. PHP declare(ticks=N); 的作用 https://blog.csdn.net/udefined/article/details/24333333 2. pack &&a ...

  5. php里的declare用法

    function tick_handler () { echo "tick_handler() called<br>" ; } function tick_handle ...

  6. 走入PHP-declare、ticks、encoding、include

    declare 结构用来设定一段代码的执行指令.declare 的语法和其它流程控制结构相似(该代码为语法格式,不是代码案例,无需敲打该代码): declare (directive) stateme ...

  7. 使用SQL生成DateTime.Ticks

    在项目中我需要使用到一个随机数(Random Number),该随机数将作为 Hashtable 中的 Key 用于唯一索引数据,所以需要保持单机唯一性. 同时该随机数还需要具备可排序性以便对数据进行 ...

  8. php ticks 调试应用

    declare(ticks=1); register_tick_function('do_profile'); register_shutdown_function('show_profile'); ...

  9. php中的declare

    <?php // 事件的回调函数 function func_tick() { echo "call...\r\n"; } // 注册事件的回调函数 register_tic ...

随机推荐

  1. go_databasetest

    go_databasetest go语言的数据库测试: go get github.com/Go-SQL-Driver/MySQL package main import ( _"githu ...

  2. 基于MATLAB的GUI(Graphical User Interface)音频实时显示设计

    摘要:本文章的设计主要讲基于matlab的gui音频实时显示设计,此次设计的gui相当于一个简洁的音乐播放器,界面只有”录音“和”播放“两个控件,哈哈,够简洁吧.通过”录音“按钮可以实现声音从电脑的声 ...

  3. [Spring] - Spring + Hibernate

    Spring整合Hibernate,花了很长时间研究,其中碰到的比较多问题. 使用的是Spring3.0+Hibernate4.1.6,Spring整合最新版本的Hibernate4.5,会抛些奇奇怪 ...

  4. RMAN_学习笔记5_RMAN Catalog Script恢复目录脚本

    2014-12-24 Created By BaoXinjian

  5. ADF_Database Develop系列2_设计数据库表之Table Partitions/Create Users/Generate DDL

    2013-05-01 Created By BaoXinjian

  6. mysql查看bin日志命令

    mysqlbinlog --no-defaults   --base64-output=decode-rows -v  --start-datetime='2016-01-14 16:30:00' - ...

  7. 移动端line-height失效

    移动端高度过小,使用rem布局时div里面的文字不能用line-height垂直居中: 解决方案,先高度,字体大小扩大n倍,然后利用transform:scale(0.n)缩小即可.

  8. typedef struct 结构体

    typedef struct _TTTT_ {   int    i;  }TT_TT; 定义变量如下: struct _TTTT_  NewTT;方法1 TT_TT NewTT;方法2 是声明和定义 ...

  9. 【转】抛弃EF,20分构建一个属于自己的ORM框架

    链接:http://www.cnblogs.com/irenebbkiss/p/4157364.html

  10. 就是这么简单!使用Rest-assured 测试Restful Web Services

    使用 Rest-assured 测试 Restful Web Services 转载注明出处: http://www.cnblogs.com/wade-xu/p/4298819.html 这里向大家介 ...