我想知道为什么,如何以及何时在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);
}
答案 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可用于基本的事情,如:
在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效率降低并确保我的执行块没有按预期运行时完成勾选时宣布。