【问题标题】:What are ticks used for in PHP?PHP 中的刻度是用来做什么的?
【发布时间】:2010-09-07 06:33:41
【问题描述】:

我想知道为什么、如何以及何时在 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);
}

【问题讨论】:

标签: php


【解决方案1】:

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

正如 Chris 已经指出的,tick 不会使您的脚本成为多线程的,但它们仍然很棒。我主要将它们用于分析 - 例如,将以下内容放在脚本的最开头可以让您监控其内存使用情况:

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

?>

【讨论】:

    【解决方案2】:

    刻度可以用于基本的事情,例如:

    1. 分析您的脚本
    2. 监控内存使用情况
    3. 计算执行时间
    4. 检查资源,例如数据库连接处于活动状态

    在 PHP 4 中,您可以使用刻度来实现类似异常的错误处理。

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

    【讨论】:

    • 想知道 ReactPHP 是否曾经在他们的事件循环中使用过这个声明刻度?
    【解决方案3】:

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

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

    【讨论】:

    • 我认为@James Tang 是在询问此功能的用途。我认为他了解蜱是什么以及它们的作用。
    • @stranger,同意,但问题的how 部分促使我发布此答案。
    • 原样 (ctrl+c) (ctrl+v) 来自php.net
    【解决方案4】:

    我发现了一个特别有趣的用例,用于此处尚未列出的刻度。

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

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

    强制 PHP 在一个执行块之后宣布何时完成一个滴答,实际上迫使 zend-ng 效率降低了一点,并确保我的执行块按预期运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      相关资源
      最近更新 更多