register_tick_function

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

register_tick_function注册一个在每次滴答时执行的函数

描述

register_tick_function(callable $callback, mixed ...$args): bool

注册给定的 callback,以便在调用 滴答 时执行。

参数

callback

要注册的函数。

args

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 register_tick_function() 示例

<?php
declare(ticks=1);

// 使用函数作为回调
register_tick_function('my_function', true);

// 使用对象->方法
$object = new my_class();
register_tick_function(array($object, 'my_method'), true);
?>

参见

添加说明

用户贡献说明 5 条说明

Carlos Granados
7 年前
一个带有可变输入的工作示例,用于验证算法的渐进分析

<?php

$n
= 1000; // 输入的大小

declare(ticks=1);

class
Counter {
private
$counter = 0;

public function
increase()
{
$this->counter++;
}

public function print()
{
return
$this->counter;
}
}

$obj = new Counter;

register_tick_function([&$obj, 'increase'], true);

for (
$i = 0; $i < 100; $i++)
{
$a = 3;
}

// unregister_tick_function([&$obj, 'increase']);
// 不确定如何取消注册,您可以使用 Counter 中的静态方法和成员。

var_dump("基本低级操作数量:" . $obj->print());

?>
Peter Featherstone
7 年前
由于实现错误,在 PHP 7.0 之前,declare(ticks=1) 指令泄漏到不同的编译单元中。这不是 declare() 指令(每个文件或每个范围)应该工作的方式。

因此,PHP 5.6 和正确实现之间存在不同的实现,并且正确的实现已在 PHP 7.0 中添加。这意味着以下脚本将返回不同的结果

#index.php

<?php

declare(ticks=1);
$count = 0;

register_tick_function('ticker');
function
ticker() {
global
$count;
$count++;
}

?>

#inc.php

<?php

$baz
= "baz";
$qux = "qux";

?>

在终端中运行 php index.php 将得到

PHP 5.6 - 7
PHP 7.0 - 5
Jeremy
17 年前
我在 IIS 6/PHP 5 机器上尝试了以下操作

<?php

set_time_limit
(0);

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

$numbers = array();
for(
$i=0; $i<1000000; $i++)
{
print(
$i . "<br />");
}

print(
profiler(true));

?>

...并收到以下错误

1) PHP 遇到未处理的异常代码 -1073741674 at 0435EC5A
2) PHP 遇到访问冲突 at 02727891
3) PHP 遇到访问冲突 at 02727879
4) PHP 遇到访问冲突 at 00000000

到目前为止,代码还没有崩溃 Web 服务器,但正如警告所说,“register_tick_function() 不应与线程 Web 服务器模块一起使用。滴答在 ZTS 模式下不起作用,可能会使 Web 服务器崩溃。”

奇怪的是,代码偶尔会成功执行。
Ahmad Samiei
10 年前
将其放在您的 index.php 中以找到代码退出位置。查找 die 或 exit

function shutdown_find_exit()
{
var_dump($GLOBALS['dbg_stack']);
}
register_shutdown_function('shutdown_find_exit');
function write_dbg_stack()
{
$GLOBALS['dbg_stack'] = debug_backtrace();
}
register_tick_function('write_dbg_stack');
declare(ticks=1);
rob dot eyre at gmail dot com
13 年前
看起来 register_tick_function() 可以接受匿名函数,但 unregister_tick_function() 不行
To Top