如何避免在 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
给了我:
declare(ticks=1)
在inc.php
中未注释,结果是:
问题
有没有办法强制它遵循包含并在某种意义上使其在 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 中的每个文件上重新声明刻度的主要内容,如果未能解决你的问题,请参考以下文章