tags:

views:

27

answers:

1

Hi all,

I am just now switching back to PHP after enterprise open-source Java development for three years. Now I am tasked with updating our platform for better logging.

I now understand better how the PHP object lifecycle regarding when objects are garbage collected and have trapped my problem. I am trying to invoke the logger after its already been destructed, when a fatal error occurs. My question is, how do I fix this? How can I stop an object from being destroyed until the end of the request?

Ideally I would like to keep this logger around in memory like I would in Java but is that even possible with PHP? Is there anything shared between two different threads or requests?

+2  A: 

With PHP, each request is processed by a different process -- which means you quite cannot keep some object arround between requests (you could serialize it and store it in a file or something like that, and un-serialize it when another requests comes ; but that's not really the way things are generally done)

This means each time your PHP script receives a request, you have to re-instanciate your logger.


Now, if you want to use your logger from several different classes/methods/functions in the same script, you have to know that variables are not global "by default" in PHP : a variable declared outside of a function is not accessible from inside a function, unless you said so using the global keyword.


In this kind of situation, when you want one and only one instance of a specific class (your logger) available from anywhere in your application, people often use the Singleton Design Pattern.

It'll allow to use something like this :

My_Logger_Class::log('blah');

From any portion of your code, and the log method will deal with :

  • instanciating the class if there was not already one existing instance
  • the actual logging

And, yes, the first time this method is called for one HTTP request, it'll have to re-open the log file (if logging to a file).


As a sidenote : there are already some existing great logging components, like PEAR::Log or Zend_Log.

Maybe using one of those might help you spend less time re-inventing some wheel ?

Pascal MARTIN