2010-09-07 53 views
15

我想知道是什麼原因,如何以及何時在PHP中使用蜱:什麼是在PHP中使用的蜱?

declare(ticks=1); 

// A function called on each tick event 
function tick_handler() 
{ 
    echo "tick_handler() called\n"; 
} 

register_tick_function('tick_handler'); 

$a = 1; 

if ($a > 0) { 
    $a += 2; 
    print($a); 
} 
+0

可能重複的[在PHP中,什麼是勾號?](http://stackoverflow.com/questions/1629005/in-php-what-is-a-tick) – 2010-09-07 10:30:33

回答

3

Tick是一個發生在declare塊內的解釋器每執行N低級別聲明的事件。爲N值的declare中的directive部分用ticks=N指定。

在每個tick中發生的事件(一個或多個)使用的是register_tick_function()指定。

+1

我想@James Tang要求此功能用於什麼。我想他知道滴答是什麼以及他們做了什麼。 – strager 2010-09-07 06:42:18

+1

@stranger,同意但問題的「怎樣」部分觸發了我發佈這個答案。 – shamittomar 2010-09-07 06:45:20

+2

因爲它是(ctrl + c)(ctrl + v)從[php.net](http://www.php.net/manual/en/control-structures.declare.php#control-structures.declare.ticks ) – 2011-04-14 08:34:13

12

的用途之一是概述了[email protected]

正如克里斯已經指出,蜱不會使你的腳本多線程的,但他們仍然很大。我使用它們主要用於分析 - 例如,將下面的腳本的最開始允許用戶監視其內存使用:

<?php 

function profiler($return=false) { 
    static $m=0; 
    if ($return) return "$m bytes"; 
    if (($mem=memory_get_usage())>$m) $m = $mem; 
} 

register_tick_function('profiler'); 
declare(ticks=1); 

/* 
Your code here 
*/ 

echo profiler(true); 

?>

這種方法比調用memory_get_usage僅在腳本的結尾更準確。它雖然:)

[email protected]描述的另一種使用的一些性能開銷:

,因爲我瞭解蜱我第一次想到「WTF,沒用的廢物」 - 但後來我發現了一些有用的應用...

你可以聲明蜱功能,檢查你的腳本的每個n執行的連接是否還活着與否,對於某種腳本非常有用以減少serverload

<?php 

function check_connection() 
{ if (connection_aborted()) 
    { // do something here, e.g. close database connections 
     // (or use a shutdown function for this 
     exit; } 
} 

register_tick_function("connection"); 

declare (ticks=20) 
{ 
    // put your PHP-Script here 
    // you may increase/decrease the number of ticks 
} 

?>
7

蜱可用於基本的東西,如:

  1. 剖析你的腳本
  2. 監視內存的使用情況
  3. 計數的執行時間
  4. 檢查資源,例如數據庫連接是活的

在PHP 4中,您可以使用ticks來實現類似異常的錯誤處理。

蜱可用於其他的一些東西,像實現一個事件驅動的應用程序(例如遊戲)。

+0

不知道ReactPHP是否曾經使用這個聲明他們的事件循環的蜱? – CMCDragonkai 2015-05-18 07:28:03

0

我發現蜱這裏沒有列出但一個特別有趣的使用情況。

我面臨的情景在我守護在那裏,我想利用pcntl_fork,並確保它發生的時候正是我期望太高,但症狀,其中顯示我其他的。 問題歸結爲兩個部分,(1)的zend-NG(PHP7的新引擎)如何整理ç處決根據您編譯PHP指令,即每個組執行的,我們有一個「滴答」之間,和(2)如何資源在PHP中暴露給你,即文件描述符是由C代碼在O/S上創建的,當你的代碼編譯成C時,C代碼可能會或可能不在預期的執行塊中。

簡而言之,我在父進程中打開一個套接字,並在一個子進程中使用它,簡單的吧?嗯,沒有,子進程中的資源並不總是像預期的那樣存在,並且在所有情況下父進程都沒有終止(這通常解釋了爲什麼你失去了訪問開放資源的原因)

強制PHP在tick是在一個執行塊實際上迫使zend-ng效率稍低一點並確保我的執行塊沒有像預期的那樣運行之後完成的。