一般用法是 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