Jednou denně - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



PHP

Jednou denně

27. dubna 2001, 00.00 | Další variace na generování často používaných dat. Máte pocit, že je zbytečné pokaždé počítat prvky databáze, případně zjištovat, kdo že má svátek? Nechte tyto údaje vygenerovat prvním návštěvníkem serveru. Zvláště vhodné pro stránky umístěné na freewebu!

"Raz denne"

alebo ako neopakovať časť skriptu pri každej návšteve web serveru.

Neviem ako vy, ale ja som zistil, že niektoré časti mojich skriptov zbytočne zaťažujú a spomaľujú načítavanie stránok z web serveru. Ktoré sú to tie zbytočné ? Za zbytočné považujem tie, ktorých výsledok je v rámci jedného dňa rovnaký. Napríklad, keď web vypisuje kto má dnes meniny (česky - svátek). Nie je nutné, aby pri každom vyvolaní skriptu, t.j. pri každom novom návštevníkovi, sa vyhľadávalo z databázy mien znova. Môžete namietať, že zistenie svátku nie je časovo náročné. Súhlasím, ale nejaký jednoduchý príklad musím uviesť. Ako ďalšie príklady môžem uviesť: denné, týždenné alebo mesačné štatistiky (napr. počet článkov na serveri, počet vtipov, atď.). To znamená, že ak máte web server, ktorý zobrazuje svátek a denné, týždenné a mesačné počty článkov, tak namiesto 4 prístupov do databáz sa realizuje 1. Ďalšia úspora času je, ak sa údaje vyhľadávajú podľa zložitejších podmienok, pretože náhradou sa to zmení na jednoduchý SELECT. Dokonca sú určité funkcie, napr. "obrázok pre tento deň", ktoré vyžadujú, aby sa nevytvárali znova pri každej návšteve web serveru, ale musia zostať rovnaké po celý deň. Ako vidieť, realizácia funkčnosti "raz denne" má svoje výhody.

Princíp spočíva v tom, že opakujúce sa funkcie vyvoláme raz a ich výsledok uložíme do jednoduchej pomocnej tabuľky (opäť použijem db systém MySQL). Pri opakovanom volaní stránok, či návšteve web serveru, už použijeme iba výsledok z pomocnej tabuľky. Pre ilustráciu použijem nasledovnú tabuľku "status":
CREATE TABLE status (datum date NOT NULL, dsvatek char(50),
 zsvatek char(50), clanky int(11), vtipy int(11), PRIMARY KEY (datum));

Pre príklad som uviedol iba ukladanie dnešného a zajtrajšieho svátku a počet článkov a počet vtipov nachádzajúcich sa na web serveri. Pre Vaše použitie nič nebráni, aby ste v takejto tabuľke mali položiek viac.

A teraz k samotným skriptom. Najprv zistíme, či už náhodou nemáme vygenerované dnešné data, t.j. záznam s dnešným dátumum:
  $dnes = Date("Y-m-d",Time());
  $sql = "select datum from status where datum='$dnes'";
  $result = mysql_query($sql);
  if (!($row = mysql_fetch_row($result)))
    raz_denne();


Ak tam záznam s dnešným dátumom nie je, tak sa nedeje nič, pretože už máme pripravené data v pomocnej tabuľke. Ak však tam záznam s dnešným dátumom nie je, tak vyvoláme funkciu raz_denne(), ktorá zabezpečí naplnenie tabuľky dátami. Do takejto funkcie doporučujem vložiť všetky časti skriptov, ktorých výsledok je rovnaký v rámci jedného dňa. V našom príklade to znamená zistenie mien, kto má dnes a zajtra svátek a tiež spočítanie počtu článkov a vtipov na serveri. Príspevok o svátkoch nájdete v archíve builder.cz a spočítanie záznamov je jednoduché, napr. pre vtipy:
  $sql = "select Count(*) from vtipy";
  $result = mysql_query($sql);
  $row = mysql_fetch_row($result);
  $vtipy = $row[0];


Zápis do pomocnej tabuľky "status" vyzerá teda nasledovne:
  $sql = "insert into status set datum='$dnes', dsvatek='$svatek_dnes', 
zsvatek='$svatek_zitra', clanky='$clanky', vtipy='$vtipy'";
  $result = @mysql_query($sql);

Pre zabezpečenie, aby sa tabuľka "status" nenafukovala, zaradíme do funkcie raz_denne() mazanie starých záznamov:
  $sql = "delete from status where datum<'$dnes'";
  $result = @mysql_query($sql);

Toto mazanie však doplňte na koniec funkcie, pretože niekedy sa obsah predošlého dňa môže hodiť, napr. ak generujete náhodný obrázok na každý deň a nechcete, aby dva dni po sebe náhodou bol vygenerovaný rovnaký obrázok.

Na koniec funkcie sa tiež hodí zaradiť aj tzv. údržbové časti vašeho web serveru, napr. ak máte riešené návštevy na serveri pomocou session ukladaných do databázy, tak je dobré ich raz za čas (napr. raz denne :-) vymazať. Alebo staré chaty a pod. Alebo hlasovanie návštevníkov (viz príklad v článku o Kontrole viacnásobného prístupu II.).

To je všetko o tom, ako vykonať funkciu raz denne a čo do nej vložiť.

Využitie pomocnej tabuľky v skripte môže vyzerať nasledovne:
  $dnes = Date("Y-m-d",Time());
  $sql = "select clanky,vtipy from status where datum='$dnes'";
  $result = mysql_query($sql);
  $row = mysql_fetch_row($result);
  $clanky = $row[0];
  $vtipy = $row[1];

Určite mi dáte za pravdu, že toto je určite rýchlejšie než prístup do 2 databáz pre zistenie Count (*). Nehovoriac o tom, že napr. redakčné systémy majú prácu s tabuľkami zložitejšiu o rôzne podmienky výberu, vtedy je zrýchlenie ešte výraznejšie.

Máme teda za sebou programovanie a zostáva sa zamyslieť nad tým, ako to bude fungovať v praxi. Ak na web server umiestnime skript využívajúci vyššie popísanú logiku, tak každý deň prvý návštevník (iba prvý!) web serveru zistí, že sa mu úvodná stránka načíta mierne pomalšie. Je to z dôvodu, že prebieha funkcia raz_denne(), ktorá pripravuje data do pomocnej tabuľky. Relatívne pre tohto návštevníka je teda web pomalší. Pre ďalších návštevníkov web beží rýchlejšie. Dokonca sa nemusíme zmieriť ani so spomalením prvého užívateľa, pretože existujú riešenia. Zložitejšie riešenie je, že sa dohodnete s administrátorom web serveru, aby do schedulera zaradil vyvolanie vašeho skriptu niekedy po polnoci, čím sa zabezpečí naplnenie pomocnej tabuľky. Je však aj jednoduchšie riešenie - stačí nastaviť Vaše stránky do sledovacích služieb, napr. www.woko.cz alebo rexo.ay.sk a tieto Vám navštívia web server a nebude im vadiť, že práve teraz je reakcia webu na návševu pomalšia.

Na záver si dovolím zopár úvah o využití spomenutého konceptu "raz denne". Táto myšlienka nie je obmedzená na činnosti viazané na denný interval, ale je to možno využiť aj pre funkcie, ktoré sú aktivované nepravidelne. Ak web server obsahuje hitparádu (napr. obľúbených skladieb), tak nemá zmysel, aby sa pri každej návšteve vytvárala hitparáda podľa poradia skladieb. Pretože poradie sa zmení, až keď niektorý návštevník bude hlasovať. Preto je vhodné, aby sa hitparáda uložila do jednoduchej pomocnej tabuľky a znova vygenerovala iba pri novom hlasovaní. Pre bežných nehlasujúcich návštevníkov sa bude používať rýchle načítanie z pomocnej tabuľky. Verím, že sami nájdete ďalšie využitia nápadu "raz denne".

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: