Re: [RFC] session_start(), read_only, lazy_write; Take 2

From: Date: Sat, 29 Mar 2014 01:47:10 +0000
Subject: Re: [RFC] session_start(), read_only, lazy_write; Take 2
References: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  Groups: php.internals 
Request: Send a blank email to internals+get-73477@lists.php.net to get a copy of this message
On Sat, Mar 29, 2014 at 3:09 AM, Yasuo Ohgaki <yohgaki@ohgaki.net> wrote: > Hi Andrey, > > On Sat, Mar 29, 2014 at 8:41 AM, Andrey Andreev <narf@devilix.net> wrote: >> >> You yourself told me that there's no way for the SessionHandler class >> to know if the storage module supports PS_UPDATE_TIMESTAMP_FUNC() or >> not, and that because of that we can't have >> SessionHandler::updateTimestamp(). > > > It's only applicable for object based user save handler. > Since user is implemented their own handler, this limitation should not > matter. You're saying this like nobody uses the SessionHandler class. You don't know that, it's just an assumption of yours, and based on it you're willing to have a limited instead of a complete feature, while there are no real technical limitations. This is surprising, considering that you cite "lack of API" for other features that are IMO not as useful. >> > Writing data and updating time stamp for GC is distinct feature. >> >> For file-based sessions - it is, but for i.e. a database, there's not >> much difference. write() does update the timestamp, I see no reason >> why it shouldn't be able to update just the timestamp. > > > How to update time stamp is up to save handler and its storage. > Write and updating time stamp is different operation. > Memcache does not need it if data is read. RDBMS may have separate > table to keep track time stamp. For PostgreSQL, updating one field is > faster than updating whole record. I'm not saying it isn't faster to update just one field, I'm saying it's still an UPDATE clause in both cases. >> > I don't see good reason not to have API for it. >> >> - Not being able to call parent::updateTimestamp() is a good reason. >> - Having the completely unnecessary SessionUpdateTimestampInterface >> is a good reason. >> - Breaking the design of current userland implementations is a good >> reason. >> - Not being able to have lazy_write (a performance improvement, I >> remind you) by default is a good reason. > > > I think current design of object based save handler is better to be > redesigned. > > Current object based save handler registers "previous" save handler as its > base. > However, it's mostly useless without calling parent open() function. i.e. > Other > calls simply fails when it does not. > > When open() is called, some resource, e.g. file handle, db connection, etc, > is > opened. These resources cannot be accessed from user land, since it's not > "PHP resource", but raw resource. Thus it's only useful for file based > storage. > If user is using their own file based storage for some reason, they are > better > to implement their own handler fully. > > I would like to remove and clean up this in future release. You don't know how it's used. A user may just prepend the session_id before calling parent::, or inject logging into the logic, or whatever - people do all kinds of crazy stuff. >> >> > Besides modular design, if write() and updateTimestamp() are merged, >> >> > flag >> >> > parameter >> >> > for write() should be added. It breaks compatibility with current >> >> > save >> >> > handlers. I don't >> >> > want BC that could be avoided also. >> >> >> >> No it shouldn't, the decision whether to write or just update the >> >> timestamp is based on an internal flag, or on $session_data. No >> >> additional parameters are required. >> > >> > >> > I removed PS(id) dependency from s_read() with new patch as planned. Why >> > should I introduce new dependency to s_write(), i.e. sub module, that >> > breaks >> > design? It does not make sense. >> >> Convenience and consistency in the userland APIs is more important >> than "breaking" internal design. I understand you want to stick to >> best practices, but those practices are not a religion and sometimes >> you need to break them. If you ask me, a lot of things in ext/session >> are broken by design ... creating files from inside read() is one >> example, all methods exposed to userland to be in an interface is >> another. I agree, it's not perfect, but that's just what happens when >> we introduce new features into something that was never designed with >> possible changes in the future in mind. For PHP6, we'll have the >> freedom to redesign the whole thing completely, but for the time being >> - userland code is more important than not having some dependancy in >> write(). > > > It's better to stick to cleaner code. Clean code is worth to have. > As I mentioned in previous, current object based save handler design has > very > limited usage and base class part would be better to be removed in the > future. > (It's not documented also :) And as I previously mentioned - it may be limited or not useful to you, but that's just your opinion. Also, it is documented. :) Cheers, Andrey.

« previous php.internals (#73477) next »