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

Posted

技术标签:

【中文标题】如何避免在 PHP 7 中的每个文件上重新声明刻度【英文标题】:How to avoid redeclaring ticks on every file in PHP 7 【发布时间】:2017-06-08 16:04:09 【问题描述】:

概述

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+ 中成为全局?

【问题讨论】:

PHP7 中会不会有一些优化,它检测到它不需要运行inc.php 中的任何代码。您可以更改inc.php 以将内容写入文件。然后再次检查数字。 不幸的是,事实并非如此。如果我使用debug_backtrace() 进行全面检查,它甚至不会拾取inc.php 中的文件 我不明白这怎么可能。 debug_backtrace() 没有保证的副作用。 file_put_contents 确实有保证的副作用,因此编译器无法对其进行优化。 对不起,我没听懂 - 你能进一步解释一下吗?如果我用var_dump(debug_backtrace()) 替换$count,文件键永远不会引用inc.php - 但是在PHP 5.6 中会这样做 inc.php 中将$baz = "baz"; 更改为file_put_contents("txt.txt", "baz"); 【参考方案1】:

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

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

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

以下问题的答案显示了如何在 PHP 7+ 中实现这一目标

Natively profile multiple scripts in PHP7

【讨论】:

以上是关于如何避免在 PHP 7 中的每个文件上重新声明刻度的主要内容,如果未能解决你的问题,请参考以下文章

如何避免swift 3中的错误无效重新声明? [复制]

如何避免为 python 文件中的每个更改重新启动 apache 服务器?

如何在 QwtPlot 上设置固定数量的刻度

为每个方法调用处理声明文件上的 PHP 对象 [重复]

重定向到同一页面php后避免表单重新提交[重复]

如何避免重新声明子方法,仍然为不同的子类定义不同的方法?