PHP (30) - Počitadlo pomocí souborů

Dnes se podívame na to, jak umí PHP soubory na serveru přímo vytvářet. S praktickou ukázkou počitadla přístupů.

28.7.2004 15:00 | Petr Zajíc | přečteno 66216×

PHP umí soubory nejen číst a vkládat do skriptů, ale rovněž vytvářet. To může být výhodné, pokud potřebujeme uložit nějaké informace na straně serveru nebo pokud vytváříme aplikaci, která ke své činnosti potřebuje zapisovat do souborového systému.

Pro vytváření a pohyb v souborech slouží v PHP sada příkazů. Příkaz fopen soubor otevře, fread z něj přečte data, fwrite do něj data zapíše a fclose jej zavře. Funkce file_exists zjistí, zda daný soubor existuje. Tady by byla všechna další teorie nudná, takže si pojďme vytvořit něco praktického.

Součástí našeho webu může být malý textový soubor, který bude obsahovat údaj o počtu shlédnutí naší stránky - takové primitivní počítadlo. Tady je kód, který jej zrealizuje:

<?
define
("NAZEV_SOUBORU", "pocitadlo.txt");
if (
file_exists(NAZEV_SOUBORU))
{
  
$soubor=fopen(NAZEV_SOUBORU, "r+");
  
$stav=fread($soubor, 10);
}
else
{
  
$soubor=fopen(NAZEV_SOUBORU, "w");
  
$stav=0;
}
rewind($soubor);
fwrite($soubor,++$stav,10);
fclose($soubor);

echo
"Již máme zaznamenáno $stav přístupů!!!";
?>

Spustit skript

Skript sám je dobře čtivý, musíte si ovšem dát pozor na některé drobnosti. Především jsme jako název souboru pro uložení počitadla použili konstantu - to je velmi rozumné, protože časem třeba můžeme chtít umístění souboru změnit a nikomu by se nechtělo přepisovat jeho název na mnoha místech. Z programátorských fintiček jsme ještě použili preinkrementaci (++$stav) a automatickou expanzi proměnné (zaznamenáno $stav přístupů). A teď k práci se souborem:

V zásadě mohou existovat dvě situace: Celý skript se buď spouští poprvé, nebo již poněkolikáté. Pakliže se spouští prvně, nezbývá než soubor s počitadlem vytvořit a výchozí stav nastavit na nulu, pokud již počítací soubor existuje, načteme z něj aktuální stav počitadla pomocí funkce fread. Funkce fopen přijímá povinný parametr mode, který může nabývat následujících hodnot (zvýraznil jsem ty, které si pletu, raději bych uvítal dvoupísmenné hodnoty):

r
Soubor je otevřen pro čtení, ukazatel je nastaven na začátek.
r+
Soubor je otevřen pro čtení i pro zápis, ukazatel je nastaven na začátek.
w
Soubor je vytvořen a otevřen pro zápis. Pokud existoval, je zkráce na nulovou délku.
w+
Soubor je vytvořen a otevřen pro čtení i zápis. Pokud existoval, je zkráce na nulovou délku.
a
Soubor je otevřen pro připisování. Ukazatel je nastaven na konec. Pokud neexistuje, pokusí se PHP soubor vytvořit.
a+
Soubor je otevřen pro čtení nebo připisování. Ukazatel je nastaven na konec. Pokud neexistuje, pokusí se PHP soubor vytvořit.

Ještě jednou se zmíním o právech k souborům: Na úspěšné vykonání funkce fopen musíte mít k vytvářenému nebo otevíranému souboru dostatečná práva. Většinou je mít nebudete na komerčních webhostinzích, protože správci nedávají uživateli, pod nímž běží PHP příliš rozsáhlá práva. Takže, na Linuxsoftu by se Vám například vytvoření souboru nepovedlo. Pokud byste ale měli na serveru účet, mohli byste si soubor počitadla vytvořit ručně. Ani to Vám však nemusí fungovat, pokud nejste uživatelem, který spouští PHP. Já jsem například musel aby příklad fungoval soubor nejprve vytvořit, a pak změnit jeho práva tak, aby do něj mohl zapisovat a číst z něj kdokoli.

A ještě něco: Pokud požadujete otevřít soubor například v režimu r+ a nemáte k tomu práva, PHP nahlásí neúspěch a nepokusí se otevřít soubor v žádném jiném režimu (třeba, jen čtení). Myslete na to.

Pozn.: Stav počitadla nebude souhlasit s číslem určujícím počet shlédnutí tohoto článku. Tam je použita odlišná filozofie.

Možná vás napdane, co by se stalo, kdyby se do souboru pokusili přistupovat dva uživatelé najednou. V takovém případě by naše jednoduché počitadlo mohlo selhat. V praxi se v takovém případě nasazuje systém zamykání souborů, který se v PHP realizuje příkazem flock.

Soubory obsahující data

Častou úlohou související se zpracováním souborů je vytáhnout z nich data (třeba data, která se budou vkládat do databáze). PHP přímo podporuje zpracování souborů s hodnotami oddělenými středníky. Máte-li třeba následující soubor:

Petr;Zajíc;1. máje 6;Liberec
Franta;Jetel;Novodvorská 12;Praha
Pepa;Jouda;Pakoměřice 23;Pakoměřice

můžete jej rozsekat na jednotlivé hodnoty pomocí volání funkce fgetcsv.  Následující ukázka to ozřejmí:

Pozn.: Pakoměřice skutečně existují.

<?
$radek
= 1;
$soubor = fopen ("30_data.csv","r");
while (
$data = fgetcsv ($soubor, 1000))
{
  echo
"<p>Zpracovávam řádek č.$radek: <br>";
  
$radek++;
  foreach (
$data as $polozka)
  {
    print
$polozka. "<br>";
  }
}
fclose ($soubor);
?>

Spustit skript

Příkaz fgetcsv načte řádek a vrátí jej jako pole položek $data. Ta následně zobrazíme pomocí funkce foreach. Fgetcsv může obsahovat nepovinný třetí parametr, který specifikuje jiný oddělovač (třeba tabelátor, středník a podobně).

Pozn.: Většina databází má vlastní rychlý způsob načítání textových souborů do tabulek, takže to tvrzení v úvodu berte s rezervou.

Další možnosti

Zpracování souborů v PHP zahrnuje daleko více. Za určitých okolností je možné například:

My se v dalším díle našeho seriálu zaměříme na to, jak nám může PHP pomoci při kopírování souborů na server nebo při stahování souborů ze serveru.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=303