php internals — вызов функции PHP после уничтожения всех объектов

Я видел несколько ответы на порядок уничтожения объекта, и все указывают на то, что порядок не гарантируется. Поскольку я не могу контролировать порядок, я хотел бы вызвать функцию после того, как все объекты были уничтожены.

register_shutdown_function вызывается до уничтожения объекта, поэтому не вариант. Я смотрел на приемы, такие как set_error_handler, используя объект, чтобы он вызывался «поздно», но этого недостаточно.

Некоторый фон по проблеме, это комплексная CMS с десятками отдельных файлов для маршрутов (просмотра) слоя. Существует обычная загрузка, но не обычная, запускаемая при завершении работы. Я использую объектное кэширование APCu через общий унаследованный базовый класс, и мне нужно убедиться, что объект очищен. Возможно, что для любых двух экземпляров одного и того же объекта, созданного во время загрузки страницы, один может захотеть очистить себя, а другой может захотеть кэшировать себя. Очевидно, что очистка превосходит все остальное, поэтому мне нужно вызвать apc_delete для глобального набора ключей кеша, чтобы очистить все все __destruct () ‘.

1

Решение

Как я уже говорил в моем комментарии выше, смешанное состояние нескольких экземпляров объекта звучит как недостаток дизайна. Я думаю, что вы всегда хотите, чтобы все экземпляры объекта были самыми последними, или, по крайней мере, не касались кеша, если это не так. Я думаю, что ваш слой кэширования и / или загрузки объектов может справиться с этим.


Чтобы ответить на ваш основной вопрос, я написал скрипт для проверки последовательности выключения PHP:

<?php  /* Adapted from https://evertpot.com/160/ */

ob_start(
function($buffer) {
return $buffer . "output buffer flushed\n";
}
);

$empty = function() {
return true;
};

$close = function() {
echo "session close\n";
return true;
};

$write = function() {
echo "session write\n";
return true;
};

session_set_save_handler($empty, $close, $empty, $write, $empty, $empty);
session_start();

register_shutdown_function(
function() {
echo "register_shutdown_function\n";
}
);

class MyClass {
function __destruct() {
echo "object destructor\n";
}
}
$myObject = new MyClass;

Выход:

register_shutdown_function
object destructor
output buffer flushed
session write
session close

Кажется, что очистка буферизации вывода и запись / закрытие сеанса — это два места, где вы знаете, что все ваши объекты были уничтожены. (Это также предполагает, что вы не используете более новую форму session_set_save_handler, которая может зарегистрировать себя как функцию завершения работы.)

4

Другие решения

Вы пытались вызвать функцию в __destruct() функционировать? PHP вызывает эту функцию после уничтожения всех объектов, так что это может помочь.

0

По вопросам рекламы [email protected]