注意,调用 declare 的两种方法并不完全相同。
方法 1
<?php
function do_tick($str = '') {
list($sec, $usec) = explode(' ', microtime());
printf("[%.4f] Tick.%s\n", $sec + $usec, $str);
}
register_tick_function('do_tick');
do_tick('--start--');
declare(ticks=1);
while(1) sleep(1);
?>
方法 2
<?php
function do_tick($str = '') {
list($sec, $usec) = explode(' ', microtime());
printf("[%.4f] Tick.%s\n", $sec + $usec, $str);
}
register_tick_function('do_tick');
do_tick('--start--');
declare(ticks=1) {
while(1) sleep(1);
}
?>
请注意,当在 declare 后使用 {} 时,do_tick 直到我们进入 declare {} 块大约 1 秒后才被自动调用。但是,当不使用 {} 时,do_tick 在调用 declare(); 后不仅被自动调用了一次,而是被调用了两次。
我假设这是由于 PHP 处理 tick 的内部机制造成的。也就是说,没有 {} 的 declare() 似乎会触发更多低级指令,从而在声明的过程中多次触发 tick(如果 ticks=1)。