/** * Writes item into the cache. * @param string key * @param mixed data * @param array dependencies * @return void */ public function write($key, $data, array $dp) { if (isset($dp[NCache::ITEMS])) { throw new NotSupportedException('Dependent items are not supported by MemcachedStorage.'); } $key = $this->prefix . $key; $meta = array( self::META_DATA => $data, ); $expire = 0; if (isset($dp[NCache::EXPIRATION])) { $expire = (int) $dp[NCache::EXPIRATION]; if (!empty($dp[NCache::SLIDING])) { $meta[self::META_DELTA] = $expire; // sliding time } } if (isset($dp[NCache::CALLBACKS])) { $meta[self::META_CALLBACKS] = $dp[NCache::CALLBACKS]; } if (isset($dp[NCache::TAGS]) || isset($dp[NCache::PRIORITY])) { if (!$this->journal) { throw new InvalidStateException('CacheJournal has not been provided.'); } $this->journal->write($key, $dp); } $this->memcache->set($key, $meta, 0, $expire); }
/** * Writes item into the cache. * @param string key * @param mixed data * @param array dependencies * @return void */ public function write($key, $data, array $dp) { $meta = array( self::META_TIME => microtime(), ); if (isset($dp[NCache::EXPIRATION])) { if (empty($dp[NCache::SLIDING])) { $meta[self::META_EXPIRE] = $dp[NCache::EXPIRATION] + time(); // absolute time } else { $meta[self::META_DELTA] = (int) $dp[NCache::EXPIRATION]; // sliding time } } if (isset($dp[NCache::ITEMS])) { foreach ((array) $dp[NCache::ITEMS] as $item) { $depFile = $this->getCacheFile($item); $m = $this->readMetaAndLock($depFile, LOCK_SH); $meta[self::META_ITEMS][$depFile] = $m[self::META_TIME]; // may be NULL unset($m); } } if (isset($dp[NCache::CALLBACKS])) { $meta[self::META_CALLBACKS] = $dp[NCache::CALLBACKS]; } if (!isset($this->locks[$key])) { $this->lock($key); if (!isset($this->locks[$key])) { return; } } $handle = $this->locks[$key]; unset($this->locks[$key]); $cacheFile = $this->getCacheFile($key); if (isset($dp[NCache::TAGS]) || isset($dp[NCache::PRIORITY])) { if (!$this->journal) { throw new InvalidStateException('CacheJournal has not been provided.'); } $this->journal->write($cacheFile, $dp); } ftruncate($handle, 0); if (!is_string($data)) { $data = serialize($data); $meta[self::META_SERIALIZED] = TRUE; } $head = serialize($meta) . '?>'; $head = '<?php //netteCache[01]' . str_pad((string) strlen($head), 6, '0', STR_PAD_LEFT) . $head; $headLen = strlen($head); $dataLen = strlen($data); do { if (fwrite($handle, str_repeat("\x00", $headLen), $headLen) !== $headLen) { break; } if (fwrite($handle, $data, $dataLen) !== $dataLen) { break; } fseek($handle, 0); if (fwrite($handle, $head, $headLen) !== $headLen) { break; } flock($handle, LOCK_UN); fclose($handle); return; } while (FALSE); $this->delete($cacheFile, $handle); }