PHP declare(ticks=N); 的作用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM