Hey all,
        I just made some modifications to sfProcessCache to use sfFileCache  
as a default option if you do not have APC, XCache, or Eaccelerator  
installed.

        It is pretty simple, and the only assumption I make it the storage  
path.  I set the storage path to:
sfConfig::get('sf_cache_dir').DIRECTORY_SEPARATOR.'sfProcessCache';
        
        I am not sold on this, due to the fact that you can not change it  
without changing the class, or extending the class.  This should be  
refactored back into a YAML file, but I figure this may be useful now  
to you all.

        If anyone wants to get this into the symfony repository, feel free.   
Also feel free to adjust anything (such as making the file path user  
configurable).

Comments?  Concerns?

Here is the file:


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"symfony developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/symfony-devs?hl=en
-~----------~----~----~----~------~----~------~--~---

<?php

/*
 * This file is part of the symfony package.
 * (c) 2004-2006 Fabien Potencier <[EMAIL PROTECTED]>
 * 
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

/**
 * Allows for data caching, using APC, XCache, Eaccelerator, and sfFileCache.
 *
 * @package    symfony
 * @subpackage cache
 * @author     Fabien Potencier <[EMAIL PROTECTED]>
 * @author     Greg Militello <[EMAIL PROTECTED]>
 * @version    SVN: $Id$
 */
class sfProcessCache
{
  public static function cacher()
  {
    static $cacher = null;

    if (!$cacher)
    {
      if (function_exists('apc_store'))
      {
        $cacher = 'apc';
      }
      elseif (function_exists('xcache_set'))
      {
        $cacher = 'xcache';
      }
      elseif (function_exists('ecacher_put'))
      {
        $cacher = 'eaccelerator';
      }
      else
      {
        $cacher = 'sfFileCache';
      }
    }

    return $cacher;
  }

  public static function filePath()
  {
    static $filePath = null;

    if (!$filePath)
    {
      $filePath = sfConfig::get('sf_cache_dir').DIRECTORY_SEPARATOR.'sfProcessCache';
    }

    return $filePath;
  }

  public static function set($name, $value, $lifeTime = 0)
  {
    switch (self::cacher())
    {
      case 'apc':
        return apc_store($name, $value, $lifeTime);
      break;
      case 'xcache':
        return xcache_set($name, $value, $lifeTime);
      break;
      case 'eaccelerator':
        return eaccelerator_put($name, serialize($value), $lifeTime);
      break;
      case 'sfFileCache':
        $cacher = new sfFileCache (self::filePath());
        $success = $cacher->set ($name, 'sfProcessCache', $value);
        if (sfConfig::get('sf_logging_active'))
        {
          if ($success) {
            sfContext::getInstance()->getLogger()->info(sprintf('{sfProcessCache} Successfully set "%s" to cache', $name));
          } else {
            sfContext::getInstance()->getLogger()->info(sprintf('{sfProcessCache} Unsuccessfully set "%s" to cache, may not have been set', $name));
          }
        }
        return $success;
      break;
    }

    return false;
  }

  public static function get($name)
  {
    switch (self::cacher())
    {
      case 'apc':
        $value = apc_fetch($name);
        return false === $value ? null : $value;
      break;
      case 'xcache':
        return xcache_isset($name) ? xcache_get($name) : null;
      break;
      case 'eaccelerator':
        return unserialize(eaccelerator_get($name));
      break;
      case 'sfFileCache':
        $cacher = new sfFileCache (self::filePath());
        $success =  $cacher->get ($name, 'sfProcessCache');
        if (sfConfig::get('sf_logging_active'))
        {
          if ($success) {
            sfContext::getInstance()->getLogger()->info(sprintf('{sfProcessCache} Successfully read "%s" from cache', $name));
          } else {
            sfContext::getInstance()->getLogger()->info(sprintf('{sfProcessCache} Unsuccessfully read "%s" from cache, may not have been set', $name));
          }
        }
        return $success;
      break;
    }

    return null;
  }

  public static function has($name)
  {
    switch (self::cacher())
    {
      case 'apc':
        return false === apc_fetch($name) ? false : true;
      break;
      case 'xcache':
        return xcache_isset($name);
      break;
      case 'eaccelerator':
        return null === eaccelerator_get($name) ? false : true;
      break;
      case 'sfFileCache':
        $cacher = new sfFileCache (self::filePath());
        $success = $cacher->has ($name, 'sfProcessCache');
        if (sfConfig::get('sf_logging_active'))
        {
          if ($success) {
            sfContext::getInstance()->getLogger()->info(sprintf('{sfProcessCache} Successfully read "%s" from cache', $name));
          } else {
            sfContext::getInstance()->getLogger()->info(sprintf('{sfProcessCache} Unsuccessfully read "%s" from cache, may not have been set', $name));
          }
        }
        return $success;
      break;
    }

    return false;
  }
}
        I have only tested this with symfony 0.6.3.  Your mileage my vary.


On Jan 26, 2007, at 12:06 PM, Greg Militello wrote:

>
> It looks to me like sfProcessCache is only supported with APC, XCache
> and Eaccelerator.  And it does not appear to be part of symfony
> 0.6.3.  I can not  upgrade the application I am working on to the
> latest version yet either.
>
> Thoughts?  Maybe this is an extension to sfProcessCache that does not
> require any form of accelerator, and is compatible with 0.6.3?
>
>
>
>
> On Jan 17, 2007, at 3:04 AM, Franke Gordon wrote:
>
>>
>> You can use the sfProcessCache
>>
>> Example:
>> http://www.symfony-project.com/snippets/snippet/110
>>
>> greetings
>> Gimler
>>
>>
>> -----Ursprüngliche Nachricht-----
>> Von: [email protected] [mailto:symfony-
>> [EMAIL PROTECTED] Im Auftrag von Greg Militello
>> Gesendet: Dienstag, 16. Januar 2007 21:09
>> An: symfony developers
>> Betreff: [symfony-devs] Data caching?
>>
>>
>> Hello all,
>>
>>      I've been looking for a good way to handle this, and it appear
>> (at  least to me) that symfony does not allow caching of data.
>>
>>      For example I find myself retrieving a data set that I can cache,
>> but either session variables or request parameters impact what
>> gets  displayed.
>>
>>      I was thinking an interface to do this would be very easy,  just
>> offer something along these lines:
>>
>> <?php
>>
>> $cache = new sfDataCache ();
>>
>> if (!$cache->retrieve('myDataCacheKey'))
>> {
>>   $c = new Criteria();
>>   $myData = MyPeer::doSelect($c);
>>
>>   $cache->set('myDataCacheKey', $myData);
>> }
>>
>> $myData = $cache->retrieve('myDataCacheKey');
>>
>> ?>
>>
>>      I am thinking the set method would have optional parameters for
>> setting things like cache duration, or flat file storage path.
>> Also  possibly a method to "unset" a cache key.
>>
>>
>>      Did I miss something like this in symfony?
>>      
>>
>> -Greg
>>
>>
>>
>>>
>
>
> --~--~---------~--~----~------------~-------~--~----~
> You received this message because you are subscribed to the Google  
> Groups "symfony developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to symfony-devs- 
> [EMAIL PROTECTED]
> For more options, visit this group at http://groups.google.com/ 
> group/symfony-devs?hl=en
> -~----------~----~----~----~------~----~------~--~---
>

Reply via email to