Oh, It's  in 1.3, but yeah, it's kind of a bug
It should be time() + $expires as PHP passes gc_maxlifetime to callback so
it never deletes old sessions.

But Cake fires gc() in __close() method too:
http://api13.cakephp.org/view_source/cake-session/#l-709

Try to test by increasing $probability var to 150


2012/8/1 Crazy <[email protected]>

> The function is getting called just fine, that's not the problem.
> At first I thought it was something with the php settings or cake settings.
> But the session_save_handlers are pure php, and I have the default
> settings + nothing cake related is put in between in the gc function.
>
>
> On Wednesday, August 1, 2012 9:32:38 PM UTC+2, majna wrote:
>>
>> By default there is 1% chance for gc to be called by PHP.
>> If you want to test if gc() is fired, increase *session.gc_probability *close
>> to *divisor*:
>> http://www.php.net/manual/en/**session.configuration.php#ini.**
>> session.gc-probability<http://www.php.net/manual/en/session.configuration.php#ini.session.gc-probability>
>> Then watch SQL log for that query.
>>
>> Anyway, expires should be current timestamp + Session.timeout config
>> I know, PHP and sessions - nothing but sorcery :D
>>
>> On Wednesday, August 1, 2012 9:12:13 AM UTC+2, Crazy wrote:
>>>
>>> I'm having some issues with my sessions.
>>>
>>> It's probably configuration somewhere, but don't know what to
>>> change/where to look.
>>>
>>> I'm using database sessions for my cake application, these sessions are
>>> not getting cleaned up.
>>>
>>> The app in question I have the issue on is an old one written on 1.3.10
>>> running with php version 5.3.5. The garbage collection function in the 2.x
>>> branch is the same so don't think the framework version will matter.
>>>
>>> I've tracked down the issue to the function __gc located in the
>>> CakeSession class and that function is registered there in the php
>>> session_set_save_handler function, this is the function in question:
>>>
>>> /**
>>>  * Helper function called on gc for database sessions.
>>>  *
>>>  * @param integer $expires Timestamp (defaults to current time)
>>>  * @return boolean Success
>>>  * @access private
>>>  */function __gc($expires = null) {
>>>     $model =& ClassRegistry::getObject('**Session');
>>>
>>>     if (!$expires) {
>>>         $expires = time();
>>>     }
>>>
>>>     $return = $model->deleteAll(array($model**->alias . ".expires <" => 
>>> $expires), false, false);
>>>     return $return;
>>> }
>>>
>>> Now, the comments say that $expires is a timestamp, but this isn't
>>> correct according to the php docs:
>>>
>>>
>>> gc($lifetime)
>>> The garbage collector callback is invoked internally by PHP periodically in 
>>> order to purge old session data. The frequency is controlled by 
>>> session.gc_probability and session.gc_divisor. The value of lifetime which 
>>> is passed to this callback can be set in session.gc_maxlifetime. Return 
>>> value should be TRUE for success, FALSE for failure.
>>>
>>> The value for $lifeime, so gc_maxlifetime in php.ini is the following:
>>>
>>>
>>> ; After this number of seconds, stored data will be seen as 'garbage' and
>>> ; cleaned up by the garbage collection process.session.gc_maxlifetime = 3600
>>>
>>> So this results in a query that never deletes anything:
>>>
>>> delete from cake_sessions where expires < 3600;
>>>
>>> Could someone clarify what I'm doing wrong or if this is an issue in
>>> cake itself?
>>>
>>>
>>> I've posted this on ask.cakephp.org as well, when I find
>>> the answer I'll make sure to update both locations.
>>>
>>> http://ask.cakephp.org/**questions/view/database_**
>>> sessions_garbage_collection_**issue<http://ask.cakephp.org/questions/view/database_sessions_garbage_collection_issue>
>>>
>>>
>>  --
> Our newest site for the community: CakePHP Video Tutorials
> http://tv.cakephp.org
> Check out the new CakePHP Questions site http://ask.cakephp.org and help
> others with their CakePHP related questions.
>
>
> To unsubscribe from this group, send email to
> [email protected] For more options, visit this group
> at http://groups.google.com/group/cake-php
>

-- 
Our newest site for the community: CakePHP Video Tutorials 
http://tv.cakephp.org 
Check out the new CakePHP Questions site http://ask.cakephp.org and help others 
with their CakePHP related questions.


To unsubscribe from this group, send email to
[email protected] For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to