вещь сырая, но лочит и читает при локах нормально, можно юзать :)
<?php
class Cache
{
/**
* Cache adapter
* @var Cache_ICache
*/
protected $adapter;
public function __construct(Cache_ICache $adapter)
{
$this->adapter = $adapter;
}
/**
* Singleton redis cache object
* @return Cache
*/
public static function instance()
{
static $cache;
if (!$cache)
{
$cache = new self(Cache_Redis::instance());
}
return $cache;
}
public function get($key, $locks = true)
{
if ($locks)
{
$lock = "lock." . $key;
while ($this->adapter->get($lock) >= microtime(true))
{
usleep(100000);
}
}
return $this->adapter->get($key);
}
public function set($key, $value, $locks = true)
{
$lock = "lock." . $key;
if ($locks && $value instanceof Closure)
{
$this->adapter->set($lock, 1);
$this->adapter->expire($lock, 5);
}
if ($value instanceof Closure)
{
$value = $value();
}
$this->adapter->set($key, $value);
if ($locks && $value instanceof Closure)
{
$this->adapter->delete($key);
}
}
public function expire($key, $ttl)
{
return $this->adapter->expire($key, $ttl);
}
public function delete($key)
{
return $this->adapter->delete($key);
}
}
работает с адаптером, чо там на конце ему похуй, знает 4 функции. на данный момент этот функционал меня и инетерсует.
локи используются под пхп5.3, давно я дрочил на замыкания в жс, надо же, добрались и до пхп :) неймспейсы меня все еще не радуют, но если елки-палки, то блин придется на этих лыжах ездить видимо :)
пример работы.
$object = $cache->get($name);
if (!$object)
{
$object = $cache->set($name, function () use ($id, $class)
{
return $class::getDbRow($id, $class::getTable());
}
);
$cache->expire($name, $class::$cachetime);
}
ну и интерфейсик
interface Cache_ICache
{
public function get($key);
public function set($key, $value);
public function delete($key);
public function expire($key, $ttl);
}
работает ТОЛЬКО под пхп5.3+. я все еще дрочу на замыкания, чую скоро все библиотеки свои на поддержку замыканий переведу :D