Portál AbcLinuxu, 26. prosince 2025 05:09
Zdravím, dělám web k jedné meteostanici a řeším jak zobrazovat u klientů jednotlivá naměřená data. Měřím každou minutu a zobrazuju data až 3 dni zpět, to znamená, že z databáze potřebuji vytáhnout 4320 řádků.
Současný dotaz na databázi je dělán takto:
$today_start = date("Y-m-d 0:0:0", strtotime("-2 days"));
$today_stop = date("Y-m-d 0:0:0", strtotime("+1 days"));
$vysledek = mysql_query("SELECT temp,cas,dew_point FROM mereni WHERE (cas > '$today_start') AND (cas < '$today_stop') ORDER BY cas");
if ($vysledek) {
while($zaznam = MySQL_Fetch_Array($vysledek)) {
$cas[] = $zaznam[cas];
$tep[] = $zaznam[temp];
$dp[] = $zaznam[dew_point];
}
}
Takto načtu databázi několikrát, pro každý graf zvlášť.
1) - Myslím, že bude lepší vyčíst všechno jedním dotazem a pak dále zpracovávat?
2) - Není třeba zobrazit všechny záznamy, ale třeba když minuta = 0,5,10,15,... Jak na to?
Klient má udělán automatický refresh stránky, po minutě aby viděl aktuální údaje. Jeden graf generuji cca 2s bez jiného většího zatížení, což není nejlepší. Raději bych generoval obrázky nějakým scriptem a poté si je klienti jen zobrazovali.
3) - Je vhodné použití cronu na periodické spouštění po minutě?
Taknějak si nejvíce rozumím s PHP, ale dělat v tom script aby byl spuštěný pořád a jen se po minutě probral, není nejlepší.
4) - Existovalo by jiné řešení celé aplikace?
MINUTE(cas) % 5 == 0.
Pokud držíš čas v databázi, je nejlepší používat hodiny taky z databáze. Za prvé, když máš databázi na jiným fyzickým stroji než webovku, nemusíš řešit synchronizaci času. Za druhé, databáže se ti postará o atomicitu. Na MySQL všechny volání NOW() v transakci dostanou stejný čas (dokonce i když se spustí později na replice). Takže ten interval napiš nějak takhle:
WHERE cas BETWEEN NOW() AND DATEDIFF(NOW(), interval -2 days)
Header("Cache-Control: must-revalidate");
$offset = 60;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
Header($ExpStr);
ale hlásí mi to chybu. Mám to hned na začátku, v tagu HEAD.
DATEDIFF(NOW(), interval -2 days)potřebuji něco aby mi to vzalo vždy až do půlnoci, jako mam
date("Y-m-d 0:0:0", strtotime("-2 days"))
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.