-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
clearCache.php
110 lines (104 loc) · 4.2 KB
/
clearCache.php
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
/* Для указанной карты, или для всех, если не указана
при наличии списка мусорных файлов ($trash)
каждый файл проверяется по этому списку и удаляется, если есть в.
Кроме того, если указан аргумент fresh - удаляются и протухшие тайлы
clearCache.php MapName fresh
Если у карты есть $bounds, то все тайлы за пределами границ удаляются
*/
chdir(__DIR__); // задаем директорию выполнение скрипта
require('fcommon.php');
require('params.php'); // пути и параметры
$fresh = FALSE;
if($argv) { // cli
if(@$argv[1] == 'fresh') {
$mapName = '';
$fresh = TRUE;
}
else {
$mapName = @$argv[1]; // второй элемент - первый аргумент
if(@$argv[2] == 'fresh') $fresh = TRUE;
};
}
else { // http
$mapName = $_REQUEST['r'];
$fresh = $_REQUEST['fresh'];
};
//echo "mapName=$mapName; fresh=$fresh;\n";
if($mapName) {
clearMap($mapName,$fresh);
return;
};
// Получаем список имён карт
$mapsInfo = glob("$mapSourcesDir/*.php");
array_walk($mapsInfo,function (&$name,$ind) {
$name=basename($name,'.php'); //
}); //
//echo ":<pre>"; print_r($mapsInfo); echo "</pre>";
foreach($mapsInfo as $mapName) {
echo "Processing $mapName\n";
clearMap($mapName,$fresh);
};
function clearMap($mapName,$fresh=FALSE) {
/* Для указанной карты при наличии списка мусорных файлов ($trash)
каждый файл проверяется по этому списку и удаляется, если есть в.
*/
global $mapSourcesDir, $tileCacheDir, $globalTrash;
require('mapsourcesVariablesList.php'); // потому что в файле источника они могут быть не все, и для новой карты останутся старые
@include("$mapSourcesDir/$mapName.php"); // а может, такой карты нет?
if($globalTrash) { // имеется глобальный список ненужных тайлов
if($trash) $trash = array_merge($trash,$globalTrash);
else $trash = $globalTrash;
};
//echo "trash:<pre>"; print_r($trash); echo "</pre>\n";
//echo "$tileCacheDir/$mapName\n";
clearMapLayer("$tileCacheDir/$mapName",$trash,$fresh,$ttl,$noTileReTry,$ext,$bounds); // рекурсивно обойдём дерево, потому что кеш может быть версионным
}; // end function clearMap
function clearMapLayer($indir,$trash=array(),$fresh=FALSE,$ttl=0,$noTileReTry=0,$ext='png',$bounds=null) {
/*
//$zooms = preg_grep('~.[0-9]$~',glob("$indir/*",GLOB_ONLYDIR)); // клёво же!
*/
//echo "Iteration: fresh=$fresh; ttl=$ttl; $indir\n";
$files = glob("$indir/*");
//echo "dirs:<pre>"; print_r($files); echo "</pre>\n";
foreach($files as $file) {
if(is_dir($file)) clearMapLayer($file,$trash,$fresh,$ttl,$noTileReTry,$ext,$bounds);
else {
//echo $file.' '.preg_match('~/*[0-9]\.'.$ext.'$~',$file)."\n";
[$z,$x,$y] = array_slice(explode('/',$file),-3);
//if($z>2) break; // FOR TEST //////////////
$y = pathinfo($y,PATHINFO_FILENAME);
if(!checkInBounds($z,$x,$y,$bounds)){ // тайл вообще должен быть?
echo "deleting out of bounds tile $file\n";
unlink($file);
continue;
};
if($trash){
$crc32 = hash_file('crc32b',$file);
//echo "$crc32\n";
if(in_array($crc32,$trash,TRUE)) {
echo "deleting trash tile $file\n";
unlink($file);
continue;
};
};
if($fresh){
if(filesize($file)){ //
if($ttl AND (preg_match('~/*[0-9]\.'.$ext.'$~',$file)==1) AND ((time()-@filemtime($file)-$ttl)>0)) { // если это тайл и он протух и сказано освежить
echo "deleting stinking tile $file\n";
unlink($file);
continue;
};
}
else { // файл нулевого размера
if($noTileReTry AND (preg_match('~/*[0-9]\.'.$ext.'$~',$file)==1) AND ((time()-@filemtime($file)-$noTileReTry)>0)) {
echo "deleting empty stinking tile $file\n";
unlink($file);
continue;
};
};
};
};
};
}; // end function clearMapLayer
?>