123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- <?php
- namespace WhichBrowser;
- use Psr\Cache\CacheItemPoolInterface;
- trait Cache
- {
- private $cache;
- private $expires;
- /**
- * @var boolean $cached Was this result retrieve from the cache?
- */
- public $cached = false;
- /**
- * Enable caching of results
- *
- * @param object $cache An PSR-6 cache pool (an object that implements Psr\Cache\CacheItemPoolInterface)
- * @param int $expires Optional the number of seconds after which a cached item expires, default is 15 minutes
- */
- public function setCache($cache, $expires = 900)
- {
- $this->cache = $cache;
- $this->expires = $expires;
- }
- /**
- * Apply cached data to the main Parser object
- *
- * @internal
- *
- * @param array $data An array with a key for every property it needs to apply
- */
- private function applyCachedData($data)
- {
- foreach ($data as $key => $value) {
- $this->$key = $value;
- }
- $this->cached = true;
- }
- /**
- * Retrieve the data that can be cached from the main Parser object
- *
- * @internal
- *
- * @return array An array with a key for every property that will be cached
- */
- private function retrieveCachedData()
- {
- return [
- 'browser' => $this->browser,
- 'engine' => $this->engine,
- 'os' => $this->os,
- 'device' => $this->device,
- 'camouflage' => $this->camouflage,
- 'features' => $this->features
- ];
- }
- /**
- * Retrieve the result from the cache, or analyse and store in the cache
- *
- * @internal
- *
- * @param array|string $headers An array with all of the headers or a string with just the User-Agent header
- *
- * @return boolean did we actually retrieve or analyse results
- */
- private function analyseWithCache($headers, $options = [])
- {
- if (isset($options['cache'])) {
- if (isset($options['cacheExpires'])) {
- $this->setCache($options['cache'], $options['cacheExpires']);
- } else {
- $this->setCache($options['cache']);
- }
- }
- if ($this->cache instanceof \Qii\Cache\Memcached) {
- $cacheId = 'whichbrowser_' . md5(serialize($headers));
- $item = unserialize($this->cache->get($cacheId));
- if ($item) {
- $this->applyCachedData($item);
- } else {
- $analyser = new Analyser($headers, $options);
- $analyser->setdata($this);
- $analyser->analyse();
- $data = serialize($this->retrieveCachedData());
- $this->cache->set($cacheId, $data, ['life_time' => time() + $this->expires]);
- }
- return true;
- }
- }
- }
|