一般用法是 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. Git学习:利用Git和TortoiseGit把代码传输到网络服务器

    版本控制这块,一直用SVN.感觉挺好用,比VSS要好用些.不过,近期在网上,又谈到时下很流行的Git.就想看看Git到底是何方神圣.趁着五一在家无事,就静下心来,简单研究一下. 当下,网络上提供的基于 ...

  2. [solr] - IKAnalyzer 分词加入

    1.下载IK Analyzer中文分词器:http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip 2.解压出zip ...

  3. JS操作iframe

    1. 获得iframe的window对象 存在跨域访问限制. chrome:iframeElement. contentWindow firefox: iframeElement.contentWin ...

  4. VS2013的一些常用快捷键

    1.回到上一个光标位置/前进到下一个光标位置 1)回到上一个光标位置:使用组合键“Ctrl + -”: 2)前进到下一个光标位置:“Ctrl + Shift + - ”. 2.复制/剪切/删除整行代码 ...

  5. linux 下的clock_gettime() 获取精确时间函数

    #include <time.h> int clock_gettime(clockid_t clk_id, struct timespec* tp); clock_gettime() 函数 ...

  6. [FFmpeg] ffmpeg参数详解

    ffmpeg 参数语法 ffmpeg [[options][`-i' input_file]]... {[options] output_file}... 如果没有输入文件,那么视音频捕捉就会起作用. ...

  7. silverlight简单数据绑定3

    3种数据绑定模式  OneTime(一次绑定) OneWay(单项绑定) TwoWay(双向绑定) OneTime:仅在数据绑定创建时使用数据源更新目标. 列子: 第一步,创建数据源对象让Person ...

  8. Oracle linux6.1配置yum本地源

    一.准备工作1. Linux安装盘插入光驱2. 挂载光驱 [root@localhost ~]# mount /dev/cdrom /mnt/ mount: block device /dev/sr0 ...

  9. 在IIS8添加WCF服务支持

    最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少对WCF ...

  10. java事件监听

    获取事件监听需要获取实现ActionListener接口的方法, public class SimpleEvent extends JFrame{    private JButton jb=new ...