A.L.E.C wrote:
Ondřej Žára wrote:
Are you using Debian? Debian doesn't use the session GC in PHP - instead, it cleans sessions in a cronjob. To enable PHP GC in Roundcube, one must add (to main.inc.php) these lines:
ini_set('session.gc_probability', 5); ini_set('session.gc_divisor', 100);
Values '5' and '100' were chosen experimentaly by me, use your own if you want :)
Someone should add above info to installation manual.
By the way, reading rcube_sess_gc() I found an improvement possibility. Function could be simpler and speed increased if we'll create index on cache.session_id column with "ON DELETE CASCADE" reference, but it needs innodb in mysql (foreign keys not supported by myisam tables), and triggers in sqlite (foreign keys not supported at all).
Another solution would be to get rid of the initial SELECT query and IN (... ) clauses and do one DELETE query with a JOIN between "session" and "cache" and second DELETE just for session. Both DELETEs would just have a now()-changed > $maxlifetime WHERE clause. now() is constant, so it may be better to write expression like now()-$maxlifetime > changed. If there is an index on changed column, the search would be very quick. This approach has a potential of non atomic commit if cache entry is created between the two DELETEs. So it should be wrapped into a transaction.
Another approach for MySQL is multiple table DELETE. http://dev.mysql.com/doc/refman/5.1/en/delete.html However, there are no such thing in SQLite or PostgreSQL.