一般用法是 declare(ticks=N);拿declare(ticks=1)来说,这句主要作用有两种:
1、Zend引擎每执行1条低级语句就去执行一次 register_tick_function() 注册的函数。可以粗略的理解为每执行一句php代码(例如:$num=1;)就去执行下已经注册的tick函数。 一个用途就是控制某段代码执行时间,例如下面的代码虽然最后有个死循环,但是执行时间不会超过5秒。运行 php timeout.php
1 <?php 2 declare(ticks=1); 3 4 // 开始时间 5 $time_start = time(); 6 7 // 检查是否已经超时 8 function check_timeout(){ 9 // 开始时间 10 global $time_start; 11 // 5秒超时 12 $timeout = 5; 13 if(time()-$time_start > $timeout){ 14 exit("超时{$timeout}秒\n"); 15 } 16 } 17 18 // Zend引擎每执行一次低级语句就执行一下check_timeout 19 register_tick_function('check_timeout'); 20 21 // 模拟一段耗时的业务逻辑 22 while(1){ 23 $num = 1; 24 } 25 26 // 模拟一段耗时的业务逻辑,虽然是死循环,但是执行时间不会超过$timeout=5秒 27 while(1){ 28 $num = 1; 29 }
2、declare(ticks=1);每执行一次低级语句会检查一次该进程是否有未处理过的信号,测试代码如下:
1 <?php 2 declare(ticks = 1); //每执行一次低级语句会检查一次该进程是否有未处理过的信号, 3 4 //利用计时器发送一个SIGALRM信号 5 function signal_handler($signal){ 6 print "Caught SIGALRM\n"; 7 pcntl_alarm(5); 8 } 9 10 pcntl_signal(SIGALRM, "signal_handler"); 11 pcntl_alarm(5); 12 13 while (1){ 14 sleep(1); 15 }
当然declare的效率是极低的,比较好的做法是去掉ticks,转而使用pcntl_signal_dispatch,在代码循环中自行处理信号. 具体参考:http://rango.swoole.com/archives/364
优化上述例子:
1 <?php 2 //declare(ticks = 1); //每执行一次低级语句会检查一次该进程是否有未处理过的信号,效率太低 3 4 //利用计时器发送一个SIGALRM信号 5 function signal_handler($signal){ 6 print "Caught SIGALRM\n"; 7 pcntl_alarm(5); 8 } 9 10 pcntl_signal(SIGALRM, "signal_handler"); 11 //5秒后发送信号 12 pcntl_alarm(5); 13 14 while (1){ 15 pcntl_signal_dispatch(); 16 sleep(1); 17 }
参考:http://blog.csdn.net/udefined/article/details/24333333
http://rango.swoole.com/archives/364