обзор
В 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
в inc.php
результаты:
Вопрос
Есть ли какой-либо способ заставить его следовать, включает и в каком-то смысле делает его глобальным в PHP 7+?
Согласно ошибке PHP, зарегистрированной по адресу https://bugs.php.net/bug.php?id=71448
Из-за ошибки реализации директива declare (ticks = 1) просочилась в разные единицы компиляции до PHP 7.0. Это не так, как должны работать директивы declare (), которые предназначены для каждого файла или для каждого приложения.
Так что на самом деле это была ошибка, когда-либо работавшая так же, как в PHP 5.6, и правильная реализация была добавлена в PHP 7.0. К сожалению, это означает, что он никогда не будет работать, но, по крайней мере, есть объяснение.
Существует ответ на следующий вопрос, который показывает, как добиться этого в PHP 7+
Натурально профилировать несколько скриптов в PHP7