Nette, Nette-cache, dibi: ochrana souborů a dat

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Laethnes
Člen | 53
+
0
-

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
+
0
-

Toto Nette řeší, Cache je thread-safe, pro vlastní účely můžeš použít SafeStream.

SafeStream

Editoval jasir (31. 7. 2009 14:19)

Laethnes
Člen | 53
+
0
-

jasir napsal(a):

Toto Nette řeší, Cache je thread-safe, pro vlastní účely můžeš použít SafeStream.

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
+
0
-

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
+
0
-

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)

Laethnes
Člen | 53
+
0
-

Fajn, díky. eAccelerator tam používají, takže se na to mrknu…

Panda
Člen | 569
+
0
-

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
+
0
-

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.

Laethnes
Člen | 53
+
0
-

Huh, to jsem ani nevěděl. Moc díky za info, mrknu se na to. (Jinak, používám to na data, co se hodně mění při rozjetí webu a pak opravdu jen zřídka v rámci roku.)

Jakub Šulák
Člen | 222
+
0
-

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
+
0
-

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).