Существуют ли случаи, когда деструктор в PHP НЕ вызывается?

Это моя первая публикация в stackoverflow, но я эти темы очень помогли мне!

Anywho, на мой вопрос... есть ли какие-либо экземпляры, когда деструктор в PHP НЕ вызывается? Причина, по которой я спрашиваю, заключается в том, что у меня есть класс сопоставления, который сопоставляет данные с объектами и конструктором, я запускаю транзакцию, а в деструкторе я буду называть фиксацию (у меня также будет функция-член, которая также может выполнять коммиттацию, если необходимо). Если есть какие-либо случаи, когда деструктор не вызывается, я хотел бы знать, поэтому я могу предвидеть, что это происходит и планировать соответствующим образом.

Большое спасибо!

Ответы

Ответ 1

  • В соответствии с manual деструкторы выполняются, даже если script завершается с помощью die() или exit():

    Деструктор будет вызываться, даже если выполнение script прекращено с использованием функции exit(). Вызов exit() в деструкторе предотвратит выполнение остальных процедур выключения.

  • В соответствии с этим вопросом SO деструктор выполняет не, когда выполняется время выполнения PHP (подтверждено на Apache 2, PHP 5.2 в Windows 7).

  • Деструктор также выполняет не, когда script завершается, потому что достигнут предел памяти. (Только что протестировано)

  • Деструктор выполняет выполнение фатальных ошибок (только что протестировано). Обновление: OP не может подтвердить это. Кажется, что есть фатальные ошибки, в которых все происходит.

  • Он выполняет не выполнение при анализе ошибок (потому что весь script не будет интерпретироваться)

  • Деструктор, конечно же, не будет выполняться, если произойдет сбой сервера или какое-либо другое исключение из управления PHP.

В целом, он выглядит довольно надежно.

Недостаток действий, кроме очистки в деструкторе, заключается в том, что ваши варианты там несколько ограничены. Вы больше не можете генерировать исключения (за исключением случаев, когда вы их снова поймаете внутри деструктора), вы не можете выводить какие-либо сообщения об ошибках, вы не можете больше полагаться на присутствие других объектов (например, интерфейса базы данных)..... У меня нет большого опыта работы с деструкторами, но я не уверен, что то, что вы планируете делать, - это приемлемая идея.

Ответ 2

Я бы просто хотел добавить, если у вас есть фатальная ошибка внутри деструктора, он может остановить выполнение других деструкторов.