file.php
1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
namespace Cache;
class File {
	private $expire;
	public function __construct($expire = 3600) {
		$this->expire = $expire;
		$files = glob(DIR_CACHE . 'cache.*');
		if ($files) {
			foreach ($files as $file) {
				$filename = basename($file);
				$time = substr(strrchr($file, '.'), 1);
				if ($time < time()) {
					$this->delete(substr($filename, 6, strrpos($filename, '.') - 6));
				}
			}
		}
	}
	public function get($key) {
		$files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');
		if ($files) {
			$handle = fopen($files[0], 'r');
			flock($handle, LOCK_SH);
			$size = filesize($files[0]);
			if ($size > 0) {
				$data = fread($handle, $size);
			} else {
				$data = '';
			}
			flock($handle, LOCK_UN);
			fclose($handle);
			return json_decode($data, true);
		}
		return false;
	}
	public function set($key, $value) {
		$this->delete($key);
		$file = DIR_CACHE . 'cache.' . basename($key) . '.' . (time() + $this->expire);
		$handle = fopen($file, 'w');
		flock($handle, LOCK_EX);
		fwrite($handle, json_encode($value));
		fflush($handle);
		flock($handle, LOCK_UN);
		fclose($handle);
	}
	public function delete(string $key) {
		$files = glob(DIR_CACHE . 'cache.' . basename($key) . '.*');
		if ($files) {
			foreach ($files as $file) {
				if (!@unlink($file)) {
					clearstatcache(false, $file);
				}
			}
		}
	}
}