Re: Database sessions garbage collection issue
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 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 -- 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 cake-php+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php
Re: Database sessions garbage collection issue
The function is located here: http://api13.cakephp.org/view_source/cake-session/#l-784 The value passed is the one from the php config, session.gc_maxlifetime, so in my case 3600. On Wednesday, August 1, 2012 7:58:09 PM UTC+2, cricket wrote: Where is __gc() called and what value is passed to it? On Wed, Aug 1, 2012 at 3:12 AM, 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 -- 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 cake-php+unsubscr...@googlegroups.com 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 cake-php+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php
Re: Database sessions garbage collection issue
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 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 -- 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 cake-php+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php
Re: Database sessions garbage collection issue
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 crazy...@gmail.com 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-probabilityhttp://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_**issuehttp://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 cake-php+unsubscr...@googlegroups.com 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 cake-php+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php
Re: Database sessions garbage collection issue
If you need to run gc more often, you can create Session model and override deleteAll() to fix that $expires On Wednesday, August 1, 2012 11:21:23 PM UTC+2, majna wrote: 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 crazy...@gmail.com 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-probabilityhttp://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_**issuehttp://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 cake-php+unsubscr...@googlegroups.com 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 cake-php+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php
Re: Database sessions garbage collection issue
It's the same code in the 2.x branch, I'll log a ticket, just wanted to be 100% sure before I did. In the close method it only gets called when using cache, not when using database sessions. I'll patch the function, thanks for the help. -- 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 cake-php+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php