如何避免在PHP 7中重新声明每个文件的刻度

时间:2017-06-08 16:04:10

标签: php profiling

概述

在PHP 5.6中,似乎添加declare(ticks=1)然后使用register_tick_function()将遵循任何包含并相应地提供分析信息。

在PHP 7+中,现在看来我必须在每个文件中添加declare(ticks=1)。我使用它来分析页面加载上的每个方法调用,现在不想将它添加到我的系统中的每个PHP文件中(如果它们在库中,我可以这样做)。

我无法在文档中找到有关此更改的任何内容。

复制步骤

创建以下2个文件:

的index.php

<?php

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

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

$foo = 'foo';
$bar = 'bar';

include dirname(__FILE__) . '/inc.php';

echo $count;

inc.php

<?php

#declare(ticks=1);

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

结果

在终端中运行php index.php会给我:

  • PHP 5.6 - 7
  • PHP 7.0 - 5

declare(ticks=1)中取消注释inc.php,结果为:

  • PHP 5.6 - 8
  • PHP 7.0 - 8

问题

有没有办法强制它遵循包含并在某种意义上使它在PHP 7 +中全局化?

1 个答案:

答案 0 :(得分:2)

根据https://bugs.php.net/bug.php?id=71448提交的PHP错误

  

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

所以实际上它是一个错误,它曾经像在PHP 5.6中那样工作,并且在PHP 7.0中添加了正确的实现。不幸的是,这意味着它永远不会起作用,但至少有一个解释。

以下问题的答案显示了如何在PHP 7 +

中实现这一目标

Natively profile multiple scripts in PHP7