如何避免在PHP 7中每个文件重复声明ticks

3

概述

在 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

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

  • PHP 5.6 - 8
  • PHP 7.0 - 8

问题

在PHP 7+中是否有一种强制它遵循includes并以某种方式使其全局的方法?


PHP7 可能有一些优化,它会检测到不需要运行 inc.php 中的任何代码。你可以将 inc.php 更改为写入文件。然后再次检查数字。 - Halcyon
很遗憾,这还不够。如果我使用“debug_backtrace()”进行完整检查,它甚至无法捕获“inc.php”中的文件。 - Peter Featherstone
我不认为这是可能的。debug_backtrace() 没有保证的副作用。file_put_contents 有保证的副作用,因此编译器无法将其优化掉。 - Halcyon
抱歉,我不明白,请再解释一下。如果我用var_dump(debug_backtrace())替换$count,在文件键中就不会引用inc.php了 - 但在PHP 5.6中是这样的。 - Peter Featherstone
这是问题,可能是两种情况之一,但我在网上找不到任何明确的信息来说明其中哪种情况。 - Peter Featherstone
显示剩余13条评论
1个回答

2
根据在https://bugs.php.net/bug.php?id=71448提交的PHP错误报告,由于一个实现上的错误,在PHP 7.0之前,declare(ticks=1)指令泄漏到了不同的编译单元中。这并不是per-file或per-scope工作的declare()指令的预期行为。因此,事实上,它曾经在PHP 5.6中能够正常工作是一个错误,并且在PHP 7.0中已经添加了正确的实现。不幸的是,这意味着它永远不会起作用,但至少有一个解释。下面的问题有一个答案,显示如何在PHP 7+中实现多个脚本的原生分析:Natively profile multiple scripts in PHP7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接