In general, I have the following scenario:
- Fetch product and its related data from database
- Convert fetched data to php 'product' object
- cache product object in session
The cache is readonly, i.e customers viewing products on the site.
But there are calls like getProductIdsByCategory($categoryId)
and the productIds from these results are cached too, per user, not using the global cache that I've read about.
A problem is that if someone on the admin side adds a new product and relates it to a category, then customers will not have the new productId come up in their cached getProductIdsByCategory
until a new session is started.
Is there a way to clear e.g $_SESSION['x']
from ALL sessions on the server when a new product is added? I don't want to destroy all sessions because customers will then lose their logins etc.
Or should I move these cached productId searches to the global cache?
p.s am using a custom built cache, not memcached or similar.
Thanks
Unless you store sessions in a database, clearing any specific bit of data will be tricky.
I would suggest caching in files rather than user sessions. This way you achieve the same benefits, but you get total control over what is cached and when it gets cleared.
By default, the session data is just serialized files somewhere in your filesystem, and it is possible to go modify all of them to remove the information in question (respecting locking so that you don't step on any currently open sessions).
I don't really recommend it, though. What I would recommend is making a method of signalling that this cached data should be refreshed, like a database-stored timestamp that gets looked at when
session_start()
happens, and if the cached data is older than the timestamp, the cache is flushed.Yes, you should move it to a global cache. Sessions are not meant to be accessed globally, I hardly think it's possible.
To disable all existing sessions for a particular application, simply modify your application to change the name of the session using PHP's
session_name('new_session_name')
. This function needs to be called before each call to session_start().This won't actually clear the current sessions, but it renders them no longer useful for this application.
Sounds to be like you could do with real shared state through a caching system like memcache.
The only other way that prints to mind is have the application check for flags for dirty cache data and delete it itself, or if your cache is in a database in a parsable serialized form write an expensive script to read them all, but that will create nasty lag with requests that have already read the data.
I would go with real shared state than checking for object copies.
to clear a session value use:
you may loop on sessions for that