On Mon, Jun 20, 2011 at 10:37 AM, Richard Quadling <rquadl...@gmail.com> wrote:
> On 20 June 2011 01:39, Arpad Ray <array...@gmail.com> wrote:
>> On Mon, Jun 6, 2011 at 5:31 PM, Richard Quadling <rquadl...@gmail.com> wrote:
>>> Not an internals expert, but I do have a question.
>>>
>>> When would the session handler object be destroyed?
>>>
>>> If sessions are being logged to a DB (maybe via a userland PHP class),
>>> is internal reference counting enough to handle the order of
>>> destruction?
>>>
>>> If the DB connection is destroyed before the session handler gets it
>>> destructor called (or the session_write_close equivalent), the session
>>> won't be able to log the data and there would be no warning to the
>>> client as engine is in auto tidy up mode.
>>>
>>
>> Hi,
>>
>> Many thanks for your question, because I hadn't given the matter much
>> thought. The current patch (#7) uses static methods so it doesn't
>> change the status quo - the user would need still need to manually
>> close the session (or register a shutdown function) in order to use an
>> object in the close() method.
>>
>> I've spent some time thinking about this and I think we have a couple
>> of options. First of all I've changed the interface so that the
>> methods are no longer static, it would already accept an object before
>> but it would just use it find the class name, and call the methods
>> statically. Now it only accepts an object.
>>
>> The two options I've implemented are:
>>
>> Destructor in the SessionHandler class:
>> http://spellign.com/patches/php-trunk-session-oo8-destruct.patch
>>
>> This works ok with some provisions:
>> - The user's SessionHandler class must hold on to any objects it will
>> need in close(), (in a property, presumably). While it's possible that
>> the session handler would still get destructed afterwards, this is the
>> only way to ensure it.
>> - If the user overrides __destruct(), they must call parent::__destruct().
>>
>> Automatically register a shutdown function:
>> http://spellign.com/patches/php-trunk-session-oo8-shutdown_function.patch
>>
>> The only argument I can think of against it is that it's possible the
>> user might, out of habit, register their own shutdown function *after*
>> calling session_set_save_handler(). In that case their shutdown
>> function would find the session already closed.
>>
>>> Obviously, if the developer takes care and calls the destructors in
>>> the right order, then everything will be OK, but this is not something
>>> I see very often.
>>>
>>> What about circular references and interdependent references?
>>>
>>
>> This would give the destructor option some trouble - in this case
>> instances are destructed in the order in which they were created, and
>> it seems likely that the DB object from your example would be created
>> first.
>>
>> I prefer the shutdown function option. We could even ensure that the
>> user's shutdown function always gets called first by adding a separate
>> hash of internal shutdown functions, however I think that would
>> overcomplicate matters for something we can clearly document.
>>
>> The option I haven't mentioned is to preserve the status quo, I think
>> that would be a pity since we have the chance to address it while
>> keeping BC now.
>>
>> I've moved the tests into a separate patch so the above differences are 
>> clearer:
>> http://spellign.com/patches/php-trunk-session-oo8-tests.patch
>>
>> Regards,
>>
>> Arpad
>>
>
> Thanks for looking into this a lot more.
>
> I've always used a First-In-Last-Out (FILO) creation/destruction order
> and incorporated the concept of "ownership".
>
> Any time an instance of a class is created, it has to be "owned" by
> another instance (of any type) or by a pseudo top-parent. In my case,
> I always have an instance of tApp, to which I attach my DB resource
> container (invariable I communicate with multiple unlink DB servers)
> and a session class (old skool).
>
> tApp is created, DB(s) are linked to. Session is started.
>
> As part of the app destructor, the session is closed first. Always.
> Then the DB connectors. For me, during the shutdown of tApp, there is
> no more activity to be processed, so the cleanup can take place in a
> controlled manner. And the reverse order seems the best way.
>
> And I always call the destructor on tApp as part of my code. A
> try{}finally{} clause would certainly be beneficial but probably not
> essential.
>
> Hopefully, by the time my script has finished, all resources are
> closed and finalised and the script engine shutdown/cleanup cycle is
> doing nothing.
>
>
> Essentially, it is moving the cleanup process into the hands of the
> developer. If they don't control the order, I'm not sure you can
> predict the order. Or if it can be predicted, it may not be the
> desired order.
>
>
>
> I think this is a great addition to PHP. I think it needs to be
> PHP\SessionHandler. I think all new classes should be namespaced to
> PHP, but that's another topic I'm sure.
>
>
> --
> Richard Quadling
> Twitter : EE : Zend : PHPDoc
> @RQuadling : e-e.com/M_248814.html : bit.ly/9O8vFY : bit.ly/lFnVea
>

Hi,

I've updated the patches with some changes suggested by Derick:

* Added PHPAPI in a couple of places so it doesn't break on Windows
* Changed PSF to PHP_SESSION_FUNC to avoid possible conflicts
* Split the tests into separate files

I'm also only including the shutdown function option, since I think
the destructor option is so clearly inferior for the reasons outlined
in my previous email that it's not worth complicating the vote.

The new patches are at:
http://spellign.com/patches/php-trunk-session-oo9.patch
http://spellign.com/patches/php-trunk-session-oo9-tests.patch

Regards,

Arpad

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to