Nette, Nette-cache, dibi: ochrana souborů a dat
- Laethnes
- Člen | 53
Když jsem dělal předchozí verzi jednoho webu (tehdy bez Nette), velice brzy jsem narazil na jeden problém: data mizela nebo byla neúplná. Po chvíli zkoumání jsem na netu zjistil, že problém je v tom, když více uživatelů přistupuje na jednu stránku – v průběhu ukládání dat jednoho zobrazení se začnou ukládat data z jiného (data jsem ukládat do souboru). Nakonec jsem skončil u toho, že je potřeba nějakou atomickou operací zamknout data pro jednoho uživatele a ostatní na něj prostě musí počkat. Někde se psalo, že se má použít flock, ale jinde jsem četl, že na vícejádrových systémech flock není atomickou operací a že se spíš doporučuje mkdir(„lock“).
Chtěl bych se tedy zeptat, jak je chráněno Nette (např. cache) a jak dělá ochranu dat dibi (používám sqlite driver) a jestli radši nemám implementovat taky takovou ochranu.
- jasir
- Člen | 746
Toto Nette řeší, Cache je thread-safe, pro vlastní účely můžeš
použít SafeStream
.
Editoval jasir (31. 7. 2009 14:19)
- Laethnes
- Člen | 53
jasir napsal(a):
Toto Nette řeší, Cache je thread-safe, pro vlastní účely můžeš použít
SafeStream
.
Aha, perfektní, díky ;). Cache je tedy v pohodě, na vlastní soubory SafeStream a co dibi a sqlite? Ano, vím, že bych se spíš měl zeptat na dibi fóru, ale snad to nevadí.
Edit: jo, ještě jedna věc – některé data ukládám tak, že vytvořím pole, se kterým pracuju, pak jej uložím do souboru (zde použiji fopen s SafeStream) jako php skript:
<?php
$pole = array(automaticky_vytvorena_data);
?>
a to proto, že občas mám pole s daty, které se mění zřídka (většinou jen kvůli administraci) a potřebuji jej celé. Tohle mě přijde jako nejrychlejší způsob (na rozdíl od např. dotazů do databáze nebo parsování nějakého souboru). Jenže, bude thread-safe metoda include(), kterou data načítám?
Editoval Laethnes (31. 7. 2009 14:49)
- jasir
- Člen | 746
Laethnes napsal(a):
Aha, perfektní, díky ;). Cache je tedy v pohodě, na vlastní soubory SafeStream a co dibi a sqlite? Ano, vím, že bych se spíš měl zeptat na dibi fóru, ale snad to nevadí.
U databází by si to měla řešit databáze sama, v případě nutnosti
provést více dotazů atomicky je určen mechanizmus transakcí jednotlivých
databázových strojů. Dibi je podporuje pomocí metod begin()
,
commit()
, rollback()
…
Editoval jasir (31. 7. 2009 14:54)
- jasir
- Člen | 746
Leathnes: Jenže, bude thread-safe metoda include(), kterou data načítám?
Řekl bych, že ano, ale nejsem si jist. Pročti si dokumentaci k tomu SafeStreamu jakými způsoby je zajištěna atomicita u jednotlivých operací. Nebo si napiš testík.
Edit: Možná do procesu mohou také zasáhnout akcelerátory PHP jako eAccelerator apod.
Editoval jasir (31. 7. 2009 15:46)
- Panda
- Člen | 569
Já bych jen dodal, že ukládání dat do PHP souboru a načítání přes
include
není moc efektivní. Takto uložená data se musí
parsovat jako regulérní PHP skript a pak vykonávat, což je u dat zbytečná
režie navíc. Lepší bude používat pro ukládání a načítání dat
používat dvojici serialize
a unserialize
, které
jsou o dost rychlejší.
- pmg
- Člen | 372
Ještě rychlejší je s několika nevýhodami parse_ini_file
.
Šel by použít ConfigAdapterIni
.
Při použití include
operace sama o sobě atomická
nebude.
Pro data, která může editovat více lidí najednou, je lepší použít databázi. To je moje zkušenost po pokusu implementovat do keše transakce, které bys pravděpodobně – kromě atomického zpracování, které by mělo být samozřejmostí – potřeboval.
- Jakub Šulák
- Člen | 222
Hlavně bych teda řekl, že zápis dat do PHP souboru není příliš bezpečný. V případě, kdy se zapomene na nějakou díru, je pak jednoduché do PHP nacpat spustitelný kód, který vykoná nějakou nebezpečnou operaci.
- Laethnes
- Člen | 53
Jakub Šulák napsal(a):
Hlavně bych teda řekl, že zápis dat do PHP souboru není příliš bezpečný. V případě, kdy se zapomene na nějakou díru, je pak jednoduché do PHP nacpat spustitelný kód, který vykoná nějakou nebezpečnou operaci.
Jn, z tohoto důvodu jsem upustil od editování samotných stránek. Nicméně tohodle bych se nebál, metoda pro zápis přijímá jen pole a zpracuje jej do dříve uvedené podoby (a znaky, jako např. $ nahrazuje tak, aby se při spuštění nenahradily proměnnými).