Мой регистратор продолжает разрушаться, пока я пытаюсь регистрировать ошибки и исключения - PullRequest
0 голосов
/ 06 октября 2009

Я только сейчас переключаюсь на PHP после трех лет разработки Java с открытым исходным кодом. Теперь передо мной стоит задача обновить нашу платформу для улучшения регистрации.

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

В идеале я хотел бы сохранить этот регистратор в памяти, как в Java, но возможно ли это даже с PHP? Есть ли что-то общее между двумя потоками или запросами?

1 Ответ

3 голосов
/ 06 октября 2009

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

Это означает, что каждый раз, когда ваш PHP-скрипт получает запрос, вы должны повторно создавать экземпляр вашего регистратора.


Теперь, если вы хотите использовать свой регистратор из нескольких разных классов / методов / функций в одном и том же скрипте, вы должны знать, что переменные не являются глобальными «по умолчанию» в PHP: переменная, объявленная вне функции, недоступна изнутри функция, если только вы не сказали это, используя глобальное ключевое слово 1009 *.


В такой ситуации, когда вы хотите, чтобы один и только один экземпляр определенного класса (ваш регистратор) был доступен из любого места в вашем приложении, люди часто используют Singleton Design Pattern .

Это позволит использовать что-то вроде этого:

My_Logger_Class::log('blah');

Из любой части вашего кода, и метод log будет иметь дело с:

  • создание экземпляра класса, если еще не было одного существующего экземпляра
  • фактическое ведение журнала

И, да, в первый раз, когда этот метод вызывается для одного HTTP-запроса, ему придется заново открыть файл журнала (при входе в файл) .


Как примечание: уже есть некоторые отличные компоненты для ведения журналов, такие как PEAR::Log или Zend_Log.

Может быть, использование одного из них поможет вам тратить меньше времени на переизобретение какого-то колеса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...