11.07.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M U J E M Ehodnota funkcie bude rov<strong>na</strong>ká ako prvýkrát, aj keï ju zavoláte znovu nieko¾kokrát posebe. Možno sa pýtate, preèo je to takto zbytoène komplikované. Všetko má však svojupríèinu – exekúcia niektorých funkcií filesystemu dos za ažuje systém. Medzi takétofunkcie patrí aj zmienená file_exists(). Preto sú hodnoty, ktoré tieto funkcie vracajú,ukladané do pamäte cache, aby boli tieto návratové hodnoty pri ïalšom volanírýchlejšie dostupné. Niekedy však potrebujeme, aby bola funkcia <strong>sk</strong>utoène vyko<strong>na</strong>ná,a nie aby boli iba interpretované výsledky z predošlých volaní. Preto existuje ïalšia funkciaclearstatcache(). Táto funkcia nemá nijaké parametre a nevracia nijakú hodnotu,jej úloha spoèíva vo vymazaní spomí<strong>na</strong>nej pamäte cache, èím sa zabezpeèízí<strong>sk</strong>anie <strong>sk</strong>utoèných a aktuálnych výsledkov funkcií, ktoré by i<strong>na</strong>k boli vyhodnocovanéz pamäte cache.Ïalšia funkcia v poradí je feof(). Ide o funkciu testujúcu koniec súboru, ktorého filepointer musíte odovzda ako parameter. Tento parameter je zároveò jediným parametromtejto funkcie. Návratovou hodnotou môže by true alebo false v závislosti odtoho, èi je ukazovate¾ súboru <strong>na</strong> jeho konci (príz<strong>na</strong>k EOF). Ak ukazovate¾ koniec súborudosiahol, vracia funkcia true. Ukážka použitia je v príklade, kde vypisujeme riadky súborudo výstupu dovtedy, kým nedosiahneme jeho koniec:$subor = fopen(“text.txt”,”r”);while (!feof($subor)) {echo fgets($subor,$text);}fclose($subor);Môže sa sta , že budete èíta zo súboru a potom niekde v jeho prostriedku znovu chcetezaèa èíta zo zaèiatku. Jedným zo spôsobov, ako to urobi , je súbor zatvori a znovuotvori , èo je programátor<strong>sk</strong>y dos „neslušné“ riešenie. Máme tu však funkciu rewind().Tá nám previnie ukazovate¾ súboru, ktorý jej zadáme ako parameter, <strong>na</strong> jeho zaèiatok.Tento file pointer je zároveò jediným parametrom funkcie. Návratovou hodnotou je 0 vprípade, že <strong>na</strong>stala nejaká chyba.Na posun ukazovate¾a po súbore slúži aj funkcia fseek(), ktorá <strong>na</strong>staví file pointer <strong>na</strong>pozíciu definovanú parametrom. Parametre sú dva, prvým je file pointer súboru, ktorýmchceme manipulova , druhým je offset, teda pozícia, <strong>na</strong> ktorú chceme ukazovate¾ umiestni .Offset vyjadruje poèet bajtov od zaèiatku súboru k žiadanej pozícii. Návratová hodnota je 0v prípade úspešného presunutia, -1 v prípade, že sa vy<strong>sk</strong>ytla nejaká chyba. Zadanie offsetuväèšieho, ako je ve¾kos súboru, teda pokus umiestni ukazovate¾ za koniec súboru (EOF), sanepokladá za chybu. Na zistenie aktuálnej pozície ukazovate¾a súboru využijeme funkciuftell(). Jediným parametrom je file pointer súboru, návratovou hodnotou je pozícia ukazovate¾asúboru (offset), v prípade chyby vracia false.Teraz sa budeme venova nieko¾kým systémovým funkciám, <strong>na</strong> ktorých použitie nie je potrebnésúbor otvára . Prvou je funkcia copy(), ktorá slúži <strong>na</strong> kopírovanie súboru a zároveòjeho premenovanie. Má dva parametre, source a desti<strong>na</strong>tion, teda zdroj a cie¾. Prvý parameter(zdroj) špecifikuje meno súboru (prípadne aj s cestou k nemu), ktorý chceme kopírova ,druhý (cie¾) z<strong>na</strong>mená umiestnenie cie¾ového (<strong>sk</strong>opírovaného) súboru a aj jeho meno. To z<strong>na</strong>èí,že pri kopírovaní môžeme zároveò súbor premenova , takže je možné kopírova do rov<strong>na</strong>kéhoadresára, v akom sa <strong>na</strong>chádza zdroj. Funkcia vracia true, ak prebehlo kopírovanie v poriadku,i<strong>na</strong>k vráti false:if (!copy(“zdroj.dat”, “zdroj.bak”)) {echo “Chyba pri kopírovaní...”;}else {echo “Kopírovanie prebehlo v poriadku...”;}Ak chceme súbor iba premenova , a nie kopírova , môžeme použi funkciu re<strong>na</strong>me().Má dva parametre, prvým je meno súboru, ktorý chceme premenova , druhým je novémeno, ktorým chceme súbor <strong>na</strong>zva . Návratové hodnoty sú rov<strong>na</strong>ké ako pri copy(), tedatrue pri úspešnom premenovaní, i<strong>na</strong>k false.Ïalšou užitoènou funkciou je filesize(). Táto funkcia umožòuje zisti ve¾kos súboru.Jej jediným parametrom je meno súboru, ktorého ve¾kos potrebujeme poz<strong>na</strong> . Návratovouhodnotou je ve¾kos súboru alebo v prípade chyby false. Treba podotknú , že výsledky tejtofunkcie sú ukladané do pamäte cache, a preto pri jej opätovnom použití je vhodné pod¾aokolností <strong>na</strong>jprv zavola funkciu clearstatcache(). Viac o funkciách, ktorých výsledky súukladané do cache, ste si mohli preèíta pri opise funkcie file_exists(). Podobne je to sfunkciou fileatime(). Táto funkcia vracia èas posledného prístupu k súboru, ktorý jejzadáte ako jediný parameter. Pri použití funkcie sa musíte teda opä vyrov<strong>na</strong> s pamä oucache. No a ešte si ukážeme, ako súbor zmaza . Na to nám poslúži funkcia unlink(), ktorámá opä jediný parameter – meno súboru, ktorý chceme zmaza . Návratová hodnota je 0alebo false v prípade vý<strong>sk</strong>ytu chyby.Teraz si povieme o ïalších dvoch možnostiach èítania súborov. Ide o využitie funkciífile() a readfile(). Obe funkcie majú nieko¾ko spoloèných vlastností – každá má jedenpovinný parameter, ktorým je meno súboru, ktorý chceme èíta . Každá má aj jeden nepovinnýparameter, ktorý nemá nejaké výz<strong>na</strong>mné využitie, a preto sa mu nebudeme venova . Noa obe funkcie slúžia <strong>na</strong> <strong>na</strong>èítanie celého obsahu súboru. V èom je teda rozdiel? Odpoveï jejednoduchá – rozdiel spoèíva v spôsobe interpretácie obsahu súboru. Funkcia readfile()obsah po <strong>na</strong>èítaní celý vypíše do výstupu (teda zväèša do výsledného generovaného dokumentu).Na druhej strane funkcia file() <strong>na</strong>èíta súbor do po¾a, prièom jednému elementupo¾a zodpovedá jeden riadok. Jednoducho povedané, súbor s desiatimi riadkami je <strong>na</strong>èítanýdo po¾a s desiatimi prvkami. Z toho vyplýva, že výsledok funkcie file() musíme priradi premennejtypu pole, zatia¾ èo výsledok readfile() je poèet preèítaných bajtov, takže ak tútoinformáciu nepotrebujeme, nemusíme ju priraïova žiadnej premennej. Ešte podotýkam, že<strong>na</strong> použitie týchto funkcií netreba súbor otvára , pretože parametrom je meno súboru, niejeho file pointer.Problémy pri paralelnej práci so súbormiNajväèším problémom pri práci so súbormi <strong>na</strong> serveri, kde má prístup relatívneneobmedzený poèet používate¾ov, je takmer istá pravdepodobnos , že sa <strong>na</strong>raz pokúsipracova so súborom viac <strong>sk</strong>riptov. To má väèšinou za následok poškodenie súboru,stratu dát a aj krach programu. Preto je potrebné takéto prípady nejakým spôsobomošetri . Jedným z riešení je vždy si vytvára nejaký pracovný súbor, ktorého existencia sig<strong>na</strong>lizuje,že s potrebným súborom sa pracuje, a preto treba poèka . Implementácia riešeniaby bola približne takáto:while (file_exists(“work”)) {sleep(1);clearstatcache();}$subor = fopen(“work”,”w”);fclose($subor);..práca s potrebným súborom..unlink(“work”);Poïme si to trošku objasni . Takže <strong>na</strong> zaèiatku je cyklus while, ktorý kontroluje, èi existujesúbor work. Ak áno, <strong>na</strong> jednu sekundu sa exekúcia <strong>sk</strong>riptu zastaví, <strong>na</strong> èo námposlúži funkcia sleep(). Potom sa vymaže pamä cache a opä otestujeme existenciusúboru work. Toto sa opakuje, kým súbor work existuje. Hneï ako je tento súborzmazaný, pokraèuje <strong>sk</strong>ript tým, že vytvorí znovu súbor work, èím si rezervuje právopoužíva potrebné súbory, takže všetky ostatné <strong>sk</strong>ripty budú musie poèka . Vytvoreniesúboru work pozostáva z otvorenia <strong>na</strong> zápis a okamžitého zatvorenia. Potom samôžeme venova práci so samotnými súbormi, pre ktoré je <strong>sk</strong>ript urèený. Po ukonèenípráce <strong>sk</strong>ript zmaže súbor work a tým umožní ïalšiemu <strong>sk</strong>riptu (alebo ïalšej inštanciitoho istého <strong>sk</strong>riptu) prácu so súbormi a sám konèí. Ide o z<strong>na</strong>ène „sedliacke“ riešenie,no funkèné a použite¾né.Druhá možnos je použi funkciu (nebojte sa, už je to posledná, o ktorej si dnespovieme ;-)) <strong>na</strong> „uzamknutie“ súborov. Ide o funkciu flock(). Prvým parametrom je filepointer, takže pred uzamknutím súboru je potrebné <strong>na</strong>jprv ho otvori . Druhým parametromje èíselný kód operácie, ktorú chcete <strong>na</strong> súbore vyko<strong>na</strong> :1 – zdie¾aný prístup, sprístupní súbor <strong>na</strong> èítanie2 – exkluzívny prístup, sprístupní súbor <strong>na</strong> zápis3 – uvo¾ní (odomkne) súbor uzamknutý predchádzajúcim volaním funkcie flock()sparametrom 1 alebo 2Takže ak chceme èíta zo súboru, otvoríme ho a následne takto uzamkneme a odomkneme:flock($subor,1);..práca so súborom (èítanie)..flock($subor,3);Nezabudnite, že ak chcete, aby bol systém používajúci flock() funkèný, musia tútofunkciu používa všetky <strong>sk</strong>ripty, i<strong>na</strong>k nemá výz<strong>na</strong>m.Tak to by bolo <strong>na</strong>dnes všetko, <strong>na</strong>budúce si povieme nieèo o formulároch a možno sami podarí vtes<strong>na</strong> aj nejaký praktický príklad, v ktorom by sme využili doposia¾ zí<strong>sk</strong>anévedomosti. Zatia¾ si v pohode užite sviatky.n Andrej Chu12/2000 PC REVUE 131

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!