ahead – 1200×100

PLAY.CZ

Právě poslouchá celkem 3753 posluchačů.

Seznam rádií

Seznam stylů

Seznam krajů

PHP a WinCache

0 Ladislav Soukup 2.7.2010

Spousty webů dnes používají skriptovací jazyk PHP… a spousty webů běží nad Windows Server za využití IIS (Internet Information Services). A spousty těchto webů by mohly běžet mnohem rychleji… a stačí tak málo… WinCache.

WinCache je taková kombinace Zend Optimizeru a MemCache. Stručně řečeno, WinCache ve verzi 1.1 dělá následující tři základní věci:

  • ukládá PHP kód v binární podobě do RAM
  • umožňuje aplikaci odkládat si libovolné datové struktury do RAM (typicky cache)
  • ukládá PHP sessions do jednoho souboru a cachuje je v RAM
  • cachuje v RAM i cesty k souborům – myšleno překlad relativních cest na cesty absolutní

Hned první bod přinese asi nejvíc muziky na nulové úsilí… Všechny PHP scripty se zkompilují do binární podoby a uloží se do RAM. Dokud nedojde ke změně zdrojového souboru nebo odstranění z cache, spouští se PHP scripty přímo z RAM (nenačítají se z disku) a navíc jsou již v binární podobě, takže je jejich běh výrazně rychlejší. PHP (a ostatní interpretované skriptovací jazyky) jinak všechny scripty “překládají” stále kolem do kola pro každé volání zvlášť.

Druhý bod je zajímavý jen pro “připravené aplikace”. V podstatě funguje stejně jako třeba oblíbená memcache. PHP aplikace mají možnost uložit libovolný datový objekt do RAM (WinCache vše ukládá v serializované podobě). Takto uložená data jsou sdílena pro všechny běžící instance PHP v rámci jednoho aplikačního poolu (viz IIS). WinCache ale negarantuje uchování těchto dat – jejich primární účel je cache. Každá uložená hodnota se identifikuje “unikátním” ID, které si určuje PHP aplikace. Existují funkce pro zápis hodnoty, čtení hodnoty, smazání hodnoty a smazání celého obsahu cache – tj. nic překvapivého. Každá uložená hodnota má svou životnost a WinCache se sama stará o mazání starých hodnot (nemažou se ale okamžitě, nicméně neplatné hodnoty již WinCache nevrátí).

WinCache také umí fungovat jako PHP session handle. Tohle funguje tak, že WinCache udržuje na disku jeden soubor, který obsahuje všechny Sessions a zároveň udržuje jejich kopii v RAM a odbavuje velkou část čtení právě z RAM. Neznám detaily (nikde jsem je nenašel), ale předpokládám, že zápis na disk proběhne jen při změně obsahu PHP session.

Poslední bod je spíše jen pomocník pro PHP engine jako takový… PHP umožňuje udávat relativní cesty k souborům, jenže při zpracování potřebuje cesty absolutní. Není to žádný velký problém, PHP si cesty přeloží, ale zabere to čas… Je známý fakt, že používání absolutních cest má pozitivní dopad na rychlost zpracování PHP. WinCache proto všechny relativní cesty přeložené na absolutní ukládá do RAM a snaží se ke zjištění absolutní cesty použít právě tuto cache.

Jak pracovat s WinCache?

Nejzajímavější pro vývojáře je právě možnost uložit si do WinCache libovolný datový objekt, na což je připravena sada funkcí. Jejich používání je naštěstí opravdu snadné.

Nejdříve uložení hodnoty do WinCache… K tomu slouží funkce

bool wincache_ucache_set ( mixed $key , mixed $value [, int $ttl = 0 ] )

Funkci se předávají 3 hodnoty: Unikátní ID, samotná hodnota (WinCache akceptuje všechny datové typy PHP s výjimkou “resources”) a poslední (volitelná) hodnota je expirace v sekundách. Pokud je třetí parametr 0, jsou data uložena po neomezenou dobu (= dokud nejsou explicitně smazána).

příklad:

$cacheID = "unikatni_ID";
$cacheLifetime = 300; // udava se v sekundach
$data = array("foo" => "bar", "foo2" => "bar2");

wincache_ucache_set($cacheID, $data, $cacheLifetime);

Druhou funkcí je

mixed wincache_ucache_get ( mixed $key [, bool &$success ] )

Této funkci stačí předat ID a odměnou vám bude uložený obsah. Funkce si sama hlídá expiraci dat.

příklad:

$cacheID = "unikatni_ID";

$data = wincache_ucache_get($cacheID, $is_cached);
if ($is_cached === true) {
print_r($data);
}

V našem případě se do $data načte dříve uložené pole.

array(2) { ["foo"]=> string(3) "bar" 
["foo2"]=> string(4) "bar2" }

Tyto dvě funkce ve své podstatě stačí k tomu, aby vše fungovalo. Ještě je tady jedna velmi užitečná funkce

bool wincache_ucache_delete ( mixed $key )

Pomocí této funkce můžete snadno odstranit libovolnou uloženou hodnotu podle jejího ID.
Případně je možné smazat celý obsah jednou funkcí

bool wincache_ucache_clear ( void )

Existují i další funkce, které mohou být zajímavé a užitečné. Jejich popis se dá najít přímo v dokumentaci PHP na adrese http://cz.php.net/manual/en/ref.wincache.php

Instalace / konfigurace

Instalace je možná dvěma způsoby… Jedna je možné použít Microsoft Web Platform Installer, nebo je možné WinCache instalovat ručně. V obou případech začíná vaše cesta na webu: http://www.iis.net/download/WinCacheForPhp. Zde najdete jak odkaz pro instalaci pomocí Web Platform Installeru, tak linky ne přímé stažení. Dále se budeme bavit jen o ruční instalaci (která je velmi snadná)…

1. stáhnout EXE (samo rozbalovací archiv) pro PHP 5.2 nebo PHP 5.3
2. spustit EXE a nechat ho někam rozbalit (obsahuje 3 soubory).

Po rozbalení uvidíte tři soubory, z nichž dva jsou zajímavé a třetí je licence. Pro rozchození WinCache nutně potřebujete jen jeden – wincache.dll. ten je potřeba zkopírovat mezi rozšíření PHP (např. C:\Program Files\PHP\ext\). Druhým krokem je oznámit existenci tohoto rozšíření PHP enginu… V podstatě stačí dopsat jeden řádek do php.ini:

extension=php_wincache.dll

Chcete-li používat WinCache i jako PHP session handler, je nutná ještě jedna úprava… Najít proměnou session.save_handler a změnit ji z hodnoty files na wincache

;session.save_handler = files
session.save_handler = wincache

A to je vše… Nic víc, nic míň! K dispozici jsou i další spousty možných nastavení, ale ty s velkou pravděpodobností nepotřebujete měnit… kompletní popis je na adrese: http://cz.php.net/manual/en/wincache.configuration.php.

Druhým souborem, který najdete ve staženém archivu, je wincache.php. Je to velmi zajímavý script, který není radno zpřístupnit široké veřejnosti… Slouží k prohlížení statistik WinCache. Vidíte tam například jak moc je cache obsazena. Vidíte i přehled uložených dat a další spousty zajímavých statistik.

dvě ukázky:

cache pro PHP scripty
uživatelská cache

Ještě jedna poznámka na závěr. WinCache běží pro každý AppPool odděleně. Což je velmi kladná vlastnost… Nehrozí tak, že by mohlo dojít ke kolizi mezi více weby na jednom IIS serveru.