什么是PHP中使用的刻度?

时间:2010-09-07 06:33:41

标签: php

我想知道为什么,如何以及何时在PHP中使用tick:

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);
}

4 个答案:

答案 0 :(得分:13)

rosen_ivanov@abv.bg概述了一种用途:

  

正如Chris已经指出的那样,ticks不会使你的脚本多线程,但它们仍然很棒。我主要使用它们进行性能分析 - 例如,在脚本的最开头放置以下内容可以监视其内存使用情况:

<?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更准确。它虽然有一些性能开销:)

warhog@warhog.net描述了另一种用法:

  

当我第一次读到“wtf,无用的垃圾”时,我读到了关于滴答声的信息 - 但后来我发现了一些有用的应用......

     

你可以声明一个tick函数来检查你的脚本的每次n次执行,无论连接是否仍然存在,对于减少服务器负载的某种脚本非常有用

<?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
}

?>

答案 1 :(得分:7)

Ticks可用于基本的事情,如:

  1. 分析您的脚本
  2. 监控内存使用情况
  3. 计算执行时间
  4. 检查资源,例如数据库连接是否正常
  5. 在PHP 4中,您可以使用tick来实现类似异常的错误处理。

    Ticks也可以用于其他事情,比如实现事件驱动的应用程序(例如游戏)。

答案 2 :(得分:3)

tick是N块中解析器执行的每个declare低级语句发生的事件。 N的值是使用declare blocks的指令部分中的ticks=N指定的。

使用register_tick_function()指定每个刻度上发生的事件。

答案 3 :(得分:0)

我发现了一个特别有趣的用例,这里还没有列出蜱。

我正在我的守护进程中遇到一个场景,我想使用pcntl_fork并确保它恰好发生在我预期的情况下,但症状在哪里显示我。 问题归结为两部分,(1)zend-ng(PHP7&#39的新引擎)如何根据编译的PHP指令整理C执行,即在每组执行之间我们有一个&#39; tick&#39 ;和(2)如何在PHP中向您公开资源,即文件描述符是由C代码在O / S上创建的,当您从代码编译成C时,C代码可能会也可能不在预期的执行块中。

简单来说,我在父进程中打开了一个套接字并在子进程中使用它,简单吧?好吧,子进程中的资源并不像预期的那样始终存在,并且在所有情况下父进程都没有终止(这通常解释了为什么你无法访问开放资源)

强制PHP在一个执行块实际强制zend-ng效率降低并确保我的执行块没有按预期运行时完成勾选时宣布。