Revize 788fa6d8
Přidáno uživatelem horkym před asi 7 roky(ů)
cron/cron.php | ||
---|---|---|
1 |
<?php |
|
2 |
|
|
3 |
require_once "dao/dao.php"; |
|
4 |
require_once "db/db-web.php"; |
|
5 |
require_once "parser.php"; |
|
6 |
require_once "process_traffic_matrix.php"; |
|
7 |
|
|
8 |
function cron() { |
|
9 |
$dbh = new DB_WEB(); |
|
10 |
$DAO = new DAO(); |
|
11 |
$DAO->setDB($dbh); |
|
12 |
|
|
13 |
$date = new DateTime(); |
|
14 |
$date->modify("-1 day"); |
|
15 |
|
|
16 |
if ($DAO->controlTrafficData($date->format("Y-m-d"))) { |
|
17 |
$parser = new Parser(); |
|
18 |
$parser->doWork($date->format("Ymd")); |
|
19 |
|
|
20 |
$traffic = $parser->getTraffic(); |
|
21 |
$locations = $parser->getLocations(); |
|
22 |
|
|
23 |
$DAO->insertVehicles(); // Pokud nejsou typy vozidel v tabulce - pridat. |
|
24 |
|
|
25 |
// Pridat udaje o novych zarizenich. |
|
26 |
foreach ($locations as $l) { |
|
27 |
$DAO->insertLocationData($l); |
|
28 |
} |
|
29 |
|
|
30 |
// Pridat zaznamy z vybraneho dne. |
|
31 |
$insertRTT = array(); |
|
32 |
$insertRT = array(); |
|
33 |
process_traffic_matrix($parser, $traffic, $DAO->findFirstId("zaznam_cas"), $DAO->findFirstId("zaznam"), $insertRTT, $insertRT, $date->format("Y-m-d")); |
|
34 |
$DAO->insertTrafficData($insertRTT, $insertRT); |
|
35 |
} |
|
36 |
} |
|
37 |
|
|
38 |
?> |
cron/dao/dao.php | ||
---|---|---|
1 | 1 |
<?php |
2 | 2 |
|
3 | 3 |
require_once "db/db-web.php"; |
4 |
require_once "location.php"; |
|
4 | 5 |
|
5 | 6 |
class DAO { |
6 | 7 |
|
7 | 8 |
protected $dbh; |
8 |
|
|
9 |
|
|
9 | 10 |
public function setDB($dbh) { |
10 | 11 |
$this->dbh = $dbh; |
11 | 12 |
} |
12 | 13 |
|
14 |
public function insertVehicles() { |
|
15 |
$query = "SELECT COUNT(*) AS total FROM vozidla"; |
|
16 |
$stmt = $this->dbh->executeQuery($query); |
|
17 |
|
|
18 |
if ($stmt->fetchAssoc()["total"] < 1) { |
|
19 |
// Pokud v tabulce s vozidlama neni zadny zaznam, pridat vsechny moznosti. |
|
20 |
$query = "INSERT INTO vozidla (id, nazev) VALUES "; |
|
21 |
$query .= "('0', 'Neznámé vozidlo'), "; |
|
22 |
$query .= "('1', 'Motocykl'), "; |
|
23 |
$query .= "('2', 'Auto'), "; |
|
24 |
$query .= "('3', 'Auto s přívěsem'), "; |
|
25 |
$query .= "('4', 'Dodávka'), "; |
|
26 |
$query .= "('5', 'Dodávka s přívěsem'), "; |
|
27 |
$query .= "('6', 'Lehký nákladní automobil'), "; |
|
28 |
$query .= "('7', 'Lehký nákladní automobil s přívěsem'), "; |
|
29 |
$query .= "('8', 'Nákladní automobil'), "; |
|
30 |
$query .= "('9', 'Nákladní automobil s přívěsem'), "; |
|
31 |
$query .= "('10', 'Autobus');"; |
|
32 |
$stmt = $this->dbh->executeQuery($query); |
|
33 |
} |
|
34 |
} |
|
35 |
|
|
36 |
public function controlTrafficData($dateStr) { |
|
37 |
$dateTo = new DateTime($dateStr); |
|
38 |
$dateTo->modify("+1 day"); |
|
39 |
$query = "SELECT COUNT(*) AS total FROM zaznam_cas WHERE datetime_od >= '$dateStr' AND datetime_od < '".$dateTo->format('Y-m-d')."';"; |
|
40 |
$stmt = $this->dbh->executeQuery($query); |
|
41 |
return $stmt->fetchAssoc()["total"] < 1; |
|
42 |
} |
|
43 |
|
|
44 |
public function insertTrafficData($insertRTT, $insertRT) { |
|
45 |
for ($i = 0; $i < 2; $i++) { |
|
46 |
$query = ""; |
|
47 |
$values = ""; |
|
48 |
$counter = 0; |
|
49 |
$array = NULL; |
|
50 |
|
|
51 |
if ($i == 0) { |
|
52 |
$query = "INSERT INTO zaznam_cas VALUES "; |
|
53 |
$array = &$insertRTT; |
|
54 |
} else { |
|
55 |
$query = "INSERT INTO zaznam VALUES "; |
|
56 |
$array = &$insertRT; |
|
57 |
} |
|
58 |
|
|
59 |
for ($j = 0; $j < count($array); $j++) { |
|
60 |
$values .= $array[$j].", "; |
|
61 |
$counter++; |
|
62 |
if ($counter == 500 || $j == (count($array) - 1)) { |
|
63 |
$query_ = $query.substr($values, 0, strlen($values) - 2).";"; |
|
64 |
$stmt = $this->dbh->executeQuery($query_); |
|
65 |
|
|
66 |
$values = ""; |
|
67 |
$counter = 0; |
|
68 |
} |
|
69 |
} |
|
70 |
} |
|
71 |
} |
|
72 |
|
|
73 |
public function insertLocationData($location) { |
|
74 |
|
|
75 |
// --- Kontrola, zda je mesto v tabulce, pripadne jeho pridani. --- |
|
76 |
|
|
77 |
$townId = $this->conditionalInsertion($location, "mesto", -1); |
|
78 |
|
|
79 |
// --- Kontrola, zda je ulice v tabulce, pripadne jeji pridani. --- |
|
80 |
|
|
81 |
$streetId = $this->conditionalInsertion($location, "ulice", $townId); |
|
82 |
|
|
83 |
// --- Kontrola, zda je zarizeni v tabulce, pripadne jeho pridani. --- |
|
84 |
|
|
85 |
$query = "SELECT * FROM zarizeni WHERE id='".$location->device."';"; |
|
86 |
$stmt = $this->dbh->executeQuery($query); |
|
87 |
|
|
88 |
if (!($stmt->fetchAssoc())) { |
|
89 |
// Zarizeni se v tabulce jeste nenachazi. |
|
90 |
$query = "INSERT INTO zarizeni VALUES ('".$location->device."', '".$location->name."', '0', '$streetId');"; |
|
91 |
$stmt = $this->dbh->executeQuery($query); |
|
92 |
} |
|
93 |
|
|
94 |
} |
|
95 |
|
|
96 |
// Pro mesta a ulice. |
|
97 |
private function conditionalInsertion($location, $table, $townId) { |
|
98 |
$query = "SELECT id FROM $table WHERE nazev="; |
|
99 |
if ($townId < 0) { |
|
100 |
// Hledame mesto. |
|
101 |
$query .= "'".$location->town."';"; |
|
102 |
} else { |
|
103 |
// Hledame ulici (s odkazem na konkretni mesto - ruzna mesta mohou mit shodny nazev nejake ulice). |
|
104 |
$query .= "'".$location->street."' AND mesto_id='$townId';"; |
|
105 |
} |
|
106 |
$stmt = $this->dbh->executeQuery($query); |
|
107 |
|
|
108 |
$id = -1; |
|
109 |
if ($row = $stmt->fetchAssoc()) { |
|
110 |
// Zaznam uz je v tabulce. |
|
111 |
$id = $row["id"]; |
|
112 |
} else { |
|
113 |
// Zaznam se v tabulce jeste nenachazi - nalezeni id pro novy zaznam. |
|
114 |
$id = $this->findFirstId($table); |
|
115 |
|
|
116 |
$query = "INSERT INTO $table VALUES "; |
|
117 |
if ($townId < 0) { |
|
118 |
$query .= "('$id', '".$location->town."');"; |
|
119 |
} else { |
|
120 |
$query .= "('$id', '".$location->street."', '$townId');"; |
|
121 |
} |
|
122 |
|
|
123 |
// Vlozeni zaznamu do tabulky. |
|
124 |
$stmt = $this->dbh->executeQuery($query); |
|
125 |
} |
|
126 |
|
|
127 |
return $id; |
|
128 |
} |
|
129 |
|
|
130 |
public function findFirstId($table) { |
|
131 |
$query = "SELECT id FROM $table ORDER BY id DESC LIMIT 1;"; |
|
132 |
$stmt = $this->dbh->executeQuery($query); |
|
133 |
|
|
134 |
$id = -1; |
|
135 |
if ($row = $stmt->fetchAssoc()) { |
|
136 |
// V tabulce je vice zaznamu. |
|
137 |
$id = $row["id"] + 1; |
|
138 |
} else { |
|
139 |
// Tabulka je prazdna. |
|
140 |
$id = 1; |
|
141 |
} |
|
142 |
|
|
143 |
return $id; |
|
144 |
} |
|
145 |
|
|
13 | 146 |
} |
14 | 147 |
|
15 | 148 |
?> |
cron/parser.php | ||
---|---|---|
6 | 6 |
class Parser { |
7 | 7 |
|
8 | 8 |
// Pro data o doprave - na kolik intervalu se ma rozdelit den (96 = 4 * 24 => intervaly po ctvrt hodine). |
9 |
private $HOW_MANY_INTERVALS = 96;
|
|
9 |
public $HOW_MANY_INTERVALS = 96;
|
|
10 | 10 |
|
11 | 11 |
// Pro data o doprave - jak dlouho v milisekundach trva jeden interval. |
12 |
private $intervalMilli;
|
|
12 |
public $intervalMilli;
|
|
13 | 13 |
|
14 | 14 |
private $name; |
15 | 15 |
private $path; |
cron/process_traffic_matrix.php | ||
---|---|---|
1 |
<?php |
|
2 |
|
|
3 |
function process_traffic_matrix($parser, $traffic, $idRecordTimeTable, $idRecordTable, &$insertRTT, &$insertRT, $date) { |
|
4 |
$times = array(); |
|
5 |
|
|
6 |
for ($i = 0; $i < $parser->HOW_MANY_INTERVALS; $i++) { |
|
7 |
$times[$i] = array(); |
|
8 |
$times[$i][0] = new DateTime($date); |
|
9 |
$times[$i][1] = new DateTime($date); |
|
10 |
|
|
11 |
$fromSec = (int) (($i * $parser->intervalMilli) / 1000); |
|
12 |
$toSec = (int) (($i + 1) * $parser->intervalMilli / 1000); |
|
13 |
|
|
14 |
$fromHours = (int) ($fromSec / 3600); |
|
15 |
$fromMinutes = (int) (($fromSec - $fromHours * 3600) / 60); |
|
16 |
$fromSeconds = (int) ($fromSec - $fromHours * 3600 - $fromMinutes * 60); |
|
17 |
|
|
18 |
$toHours = (int) ($toSec / 3600); |
|
19 |
$toMinutes = (int) (($toSec - $toHours * 3600) / 60); |
|
20 |
$toSeconds = (int) ($toSec - $toHours * 3600 - $toMinutes * 60); |
|
21 |
|
|
22 |
$times[$i][0]->setTime($fromHours, $fromMinutes, $fromSeconds); |
|
23 |
$times[$i][1]->setTime($toHours, $toMinutes, $toSeconds); |
|
24 |
} |
|
25 |
|
|
26 |
foreach ($traffic as $device => $timeIntervals) { |
|
27 |
for ($t = 0; $t < $parser->HOW_MANY_INTERVALS; $t++) { |
|
28 |
if ($timeIntervals[$t] != NULL) { |
|
29 |
for ($d = 0; $d < 2; $d++) { |
|
30 |
$dataExists = FALSE; |
|
31 |
|
|
32 |
for ($v = 0; $v < 11; $v++) { |
|
33 |
if ($timeIntervals[$t][$d][$v][0] > 0) { |
|
34 |
$dataExists = TRUE; |
|
35 |
$insertRT[] = "('".$idRecordTable++."', '".$timeIntervals[$t][$d][$v][0]."', '".($timeIntervals[$t][$d][$v][1] / $timeIntervals[$t][$d][$v][0])."', '$v', '$idRecordTimeTable')"; |
|
36 |
} |
|
37 |
} |
|
38 |
|
|
39 |
if ($dataExists) { |
|
40 |
$insertRTT[] = "('".$idRecordTimeTable++."', '".$times[$t][0]->format("Y-m-d H:i:s.u")."', '".$times[$t][1]->format("Y-m-d H:i:s.u")."', '".($d + 1)."', '$device')"; |
|
41 |
} |
|
42 |
} |
|
43 |
} |
|
44 |
} |
|
45 |
} |
|
46 |
} |
|
47 |
|
|
48 |
?> |
Také k dispozici: Unified diff
#6351: Ulozeni dat do databaze
Pridan hlavni skript pro spusteni zpracovani dat z minuleho dne (cron.php). Pridana funkce pro pripravu dat o lokacich a o doprave pro ulozeni do databaze (process_traffic_matrix.php). Pridany funkce pro ulozeni dat do databaze (dao.php).