Hi Robert,
Thanks for this. :) I'm going to try and provide some feedback for each, though mostly seems like people are discussing Robert's proposal in this thread currently.
Roberts Proposal
I've always been a fan of your proposal but always got lost in the extended details. Glad you have made it easier for people to follow. I have a few comments and questions to clarify my understanding on your revised proposal.
I'd probably prefer naming Pool interface Cache interface. It would have been far less confusing to me upon first looking at your proposal last year and I seem to recall a lot of people have asked what "pool" means since then. This alone might be a good reason to change it. On the user side, I think that type hinting (CacheInterface $cache) and using it by way of $cache->get('thing') is going to make more sense to people (at least initially) than (PoolInterface $pool) and $pool->get('thing'). This isn't a huge deal to me because I've become pretty comfortable with the Pool terminology but I wanted to point out that I had to become comfortable with the Pool terminology. :) (I agree with your assessment on Driver and Handler as not being good alternative names for this interface.)
On the getItemIIterator() naming question, I'd like to suggest getItems() as an alternate name.
On usage, I want to make sure I understand how one would set a value. Given a completely empty Pool (read: completely cold, no data cached whatsoever), the method I would use to do this conceptual thing:
$cache->set('foo', 'bar', 300);
... would be:
$item = $pool->get('foo');
$item->set('bar', 300);
... or
$pool->get('foo')->set('bar', 300);
Especially after just having reviewed the other two proposals (I'm writing this about half an hour after writing the above comments, specifically the one about the name Pool) I think that if all three were set out side by side other people would be more likely to choose yours if they knew what Pool represented and how they would use it to set a value for a key in a pool. Without that knowledge I can easily see people making another decision, especially if they haven't been able to spend as much time looking at it as those of us who have been super interested in getting a cache proposal through the queue have spent. Maybe a handful of examples on how common things would be done using the pool terminology would help make things more clear?
Evert's Proposal
After having seen Evert's proposal again, I have some comments on it as well. Most notably I'm finding myself more and more in favor of a "cache item" approach. So I'll try to keep this constructive as suggesting "please do it with a cache item?" means you'd basically be either writing Florin's proposal or Rober's. Or even Spring's. So I won't go there, 'k? :)
How common is the bulk set use case in the target audience? In looking at Florin's proposal over the last month or so I've been wanting to suggest that the multiple stuff be broken out into its own interface but seeing it in practice here makes me feel like it doesn't belong. Should supporting bulk operations be an extension to the cache proposal down the line or should it just be a part of the Base interface to begin with? I'm not sure, but if you're going for a very basic bare bones cache in your proposal you could cut your proposal to 1/3 its size by dropping the Multiple interface and its not-even-a-part-of-the-standard trait.
It has no clear() functionality that I can see.
Florin's Proposal
I've said a lot on this one already. I'm not sure where we're at on it. :)
Based on having a fresh look at the other proposals, I'd say it is safe to just skip $options and have set's method signature be $key, $value, $ttl and be done with the whole notion of TtlAwareAnything's. The $options thing was a fun rabbit hole but since nobody else is worried about support anything more than ttl at this point (or ever) let's just go with that.
This looks really close to Spring's cache with a TTL at this point. I'm sure this is a good thing for some people and a really bad thing for others. This is mostly just an observation. :)
I'm not sure about the bulk operations. I haven't said anything about them to this point because nobody else has talked about it. But after seeing it on Evert's proposal I'm finally going to voice my thoughts on this. Is this a common enough use case that it should be baked into the core cache interface?