[wp-hackers] getting the expiration value of a transient when OBJECT_CACHE is involved

Haluk Karamete halukkaramete at gmail.com
Thu Jun 26 22:10:38 UTC 2014


I had kind of sensed that Nikola that it would not be easy to get that
information - for the reasons that you eloborately explained. Thank you for
that.

Since it was way too cool to have that sort of insight displayed at the
bottom of pages, I had to find another way.

When there is a will, there is a way as they say...

So what I ended up doing was this;

Attach a piece of HTML like:  <!--timestamp:1455454343--> right within the
HTML I'm saving.
Since I'm the one who sets the transient, and I'm the one who gets it
back,  this technique guarantees that the time-stamp wwould be part of the
meal-deal, and when I retrieve the transient, then it would be a string
extract to get what I want. :)

Tested and works like a charm - no matter what the internal mechanism is...

before setting:
    $expire_time = time()+$expire;
    $transient_data = $transient_data . '<!--blp:expires{' . $expire_time .
'}-->';
    $ret_val =    set_transient($id,$transient_data,$expire);

after getting:
                $when_to_expire = blp_getinbetween
($transient_data,'<!--blp:expires{','}-->');
                $transient_data =
blp_replace($transient_data,'<!--blp:expires{' . $when_to_expire .
'}-->','');





On Thu, Jun 26, 2014 at 12:27 PM, Nikola Nikolov <nikolov.tmw at gmail.com>
wrote:

> It's not going to be very easy to do that.
>
> First of all wp_cache_add() can actually be using different storage
> mechanisms, or at least different implementations of the clients. For
> instance the most common object cache as far as I'm aware is the Memcached
> (Memcache Daemon).
> In PHP there are two general classes that act as clients for - Memcache and
> Memcached. Memcache is pretty plain and doesn't really give you a whole lot
> to work with. Memcached I think has more possibilities, but I don't think
> getting the expiration date would be one of the built-in ones.
>
> But then there could be a caching plugin that uses a different back-end to
> store objects in memory, so unless you cover all of the possibilities, then
> it's not really possible to do what you're looking to do.
>
> Is it really necessary to know when a transient will expire? You might have
> to look for a way to avoid going that way :)
>
>
> On Thu, Jun 26, 2014 at 9:21 PM, Haluk Karamete <halukkaramete at gmail.com>
> wrote:
>
> > In the code segment that I pasted below ( which is straight from the
> core -
> > > option.php  ), I 'm trying to understand how I can pull the
> expire_time (
> > the unix time stamp ) for the transient I'm after.
> >
> > When there is no object_cache is involved, that's a piece of ccake as
> > *get_option(
> > $transient_timeout )* just gets me that.
> >
> > <begin_snippet>
> >
> >     if ( wp_using_ext_object_cache() ) {
> >         $value = wp_cache_get( $transient, 'transient' );
> >     } else {
> >         $transient_option = '_transient_' . $transient;
> >         if ( ! defined( 'WP_INSTALLING' ) ) {
> >             // If option is not in alloptions, it is not autoloaded and
> > thus has a timeout
> >             $alloptions = wp_load_alloptions();
> >             if ( !isset( $alloptions[$transient_option] ) ) {
> >                 $transient_timeout = '_transient_timeout_' . $transient;
> >                 if ( get_option( $transient_timeout ) < time() ) {
> >                     delete_option( $transient_option  );
> >                     delete_option( $transient_timeout );
> >                     $value = false;
> >                 }
> >             }
> >         }
> >
> >         if ( ! isset( $value ) )
> >             $value = get_option( $transient_option );
> >     }
> >
> >
> > <end_snippet>
> >
> > But on an object cache situation, such as total_cache, that's been a
> uphill
> > battle for me.
> >
> > All I got there for inspiration is this;
> >
> > $value = wp_cache_get( $transient, 'transient' );
> >
> > When I traced that function ( wp_cache_get() ) down to its roots,  I end
> up
> > with the following which did not produce any fruits neither.
> >
> >     /**
> >      * Retrieves the cache contents from the cache by key and group.
> >      *
> >      * @since 2.0.0
> >      * @uses $wp_object_cache Object Cache Class
> >      * @see WP_Object_Cache::get()
> >      *
> >      * @param int|string $key What the contents in the cache are called
> >      * @param string $group Where the cache contents are grouped
> >      * @param bool $force Whether to force an update of the local cache
> > from the persistent cache (default is false)
> >      * @param &bool $found Whether key was found in the cache.
> > Disambiguates a return of false, a storable value.
> >      * @return bool|mixed False on failure to retrieve contents or the
> > cache
> >      *        contents on success
> >      */
> >     function wp_cache_get( $key, $group = '', $force = false, &$found =
> > null ) {
> >         global $wp_object_cache;
> >
> >         return $wp_object_cache->get( $key, $group, $force, $found );
> >     }
> >
> >
> > As you see, there is no talk on $expire there neither.
> >
> > Then the ball is sent to $wp_object_cache->get court...  and I got lost
> in
> > there.
> >
> > Could someone shed some light where to go to get that timestamp?
> >
> > My goal is to be able to report back to me when the current transient
> will
> > expire for the current page.
> >
> > On my local host, I display this at the bottom of the page without sweat:
> >
> >     This page's transient will expire in 0 day(s) 0 hour(s) 0 min(s) 30
> > sec(s)
> >
> >
> > But for the development server, I got nada. :(
> > _______________________________________________
> > wp-hackers mailing list
> > wp-hackers at lists.automattic.com
> > http://lists.automattic.com/mailman/listinfo/wp-hackers
> >
> _______________________________________________
> wp-hackers mailing list
> wp-hackers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-hackers
>


More information about the wp-hackers mailing list