Completed
Push — master ( 547bbe...6c1ef8 )
by Dmitry
03:22
created

Cache::set()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 12
ccs 0
cts 9
cp 0
rs 9.4285
cc 1
eloc 8
nc 1
nop 2
crap 2
1
<?php
2
3
namespace Basis;
4
5
use Basis\Converter;
6
use Carbon\Carbon;
7
8
class Cache
9
{
10
    private $converter;
11
12 35
    public function __construct(Converter $converter)
13
    {
14 35
        $this->converter = $converter;
15 35
        if (!is_dir('.cache')) {
16
            mkdir('.cache');
17
            chown('.cache', 'www-data');
18
            chgrp('.cache', 'www-data');
19
        }
20 35
    }
21
22
    private $cache = [];
23
24 35
    public function exists($key)
25
    {
26 35
        $filename = '.cache/'.$key;
27 35
        if (file_exists($filename)) {
28
            if (!array_key_exists($key, $this->cache)) {
29
                $this->cache[$key] = include $filename;
30
            }
31
            return $this->cache[$key]['expire'] > Carbon::now()->getTimestamp();
32
        }
33 35
    }
34
35
    public function get($key)
36
    {
37
        if ($this->exists($key)) {
38
            return $this->converter->toObject($this->cache[$key]);
39
        }
40
    }
41
42
    public function set($key, $value)
43
    {
44
        $filename = '.cache/'.$key;
45
        $data = $this->converter->toArray($value);
46
        $string = '<?php return '.var_export($data, true).';';
47
48
        file_put_contents($filename, $string);
49
        chown($filename, 'www-data');
50
        chgrp($filename, 'www-data');
51
52
        $this->cache[$key] = $data;
53
    }
54
55 35
    public function wrap($key, $callback)
56
    {
57 35
        $hash = md5(json_encode($key));
58 35
        if ($this->exists($hash)) {
59
            return $this->get($hash);
60
        }
61 35
        $result = call_user_func($callback);
62 35
        $expire = null;
63 35
        if (is_array($result) && array_key_exists('expire', $result)) {
64
            $expire = $result['expire'];
65 35
        } elseif (is_object($result) && property_exists($result, 'expire')) {
66
            $expire = $result->expire;
67
        }
68 35
        if ($expire && $expire > Carbon::now()->getTimestamp()) {
69
            $this->set($hash, $result);
70
        }
71 35
        return $result;
72
    }
73
}
74