一般用法是 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. bzoj4130: [PA2011]Kangaroos

    Description 定义两个区间互相匹配表示这两个区间有交集. 给出长度为N的区间序列A,M次询问,每次询问序列A中最长的连续子序列,使得子序列中的每个区间都与[L,R]互相匹配 N<=50 ...

  2. Sublime Text 3 插件安装及Vim 模式设置

    1.安装Sublime Text 3  下载安装:http://www.sublimetext.com/3 Package Control安装:https://sublime.wbond.net/in ...

  3. (转)原始图像数据和PDF中的图像数据

    比较原始图像数据和PDF中的图像数据,结果见表1.1.表1.1中各种“解码器”的解释见本文后续的“PDF支持的图像格式”部分,“PDF中的图像数据”各栏中的数据来自开源的PdfView.如果您有兴趣查 ...

  4. xml中的非法字符

    今使用Jdom生成xml文件的时候,总是出现0x0,0x8为非法字符,经过搜索,问题原因及解决方法如下: 原因:xml中需要过滤的字符分为两类,一类是不允许出现在xml中的字符,这些字符不在xml的定 ...

  5. gRPC Java的代码架构

    RPC(远程过程调用) 的架构最常见的是"动态代理"方式,事先定义好接口,用一个代理假装实现了这个接口(真正的实现放在服务端),供客户端调用,代理内部将该方法调用封装成一个网络请求 ...

  6. str转unsigned int

    用法 1 参数:参数类型为char, 十六进制字符串形式:0X××××××[NUT],十进制字符串形式:×××××××[NUT],字符串的最大长度为16,字符串结尾符必须为ascii码值0(NUT). ...

  7. Farey Sequence

    Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rationa ...

  8. 关于n!mod p

    2016.1.26 让我们来研究一下关于n!在mod p下的性质,当然这里p是质数. 首先n!=a*pe,其中p不可整除a.我们现在来做两件事情,求e和a mod p. 显然,n/p表示[1,n]中p ...

  9. 转:WIN7上搭建Windows Phone 8 开发环境——VMware Workstation下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法

    转自:http://www.cnblogs.com/shaddock2013/p/3155024.html 最近在试着在Windows 7上搭建Windows Phone 8的开发调试环境,使用的是V ...

  10. AX 2012 EP服务器配置多个环境

    AX 2012 如何在一台服务器配置不同环境的EP站点 安装完EP后,修改对应站点的web.config文件,指定需要连接的客户端配置文件路径即可,如下图: ` ``````````````````` ...