SafeStream: Fájlok biztonsága

A Nette SafeStream garantálja, hogy minden olvasás és írás egy fájlba elszigetelt. Ez azt jelenti, hogy egyetlen szál sem kezd el olvasni egy olyan fájlt, amely még nincs teljesen kiírva, illetve több szál sem írja felül ugyanazt a fájlt.

Telepítés:

composer require nette/safe-stream

Mire jó?

Mire is jók valójában az izolált műveletek? Kezdjük egy egyszerű példával, amely ismételten ír egy fájlba, majd ugyanazt a karakterláncot olvassa ki belőle:

$s = str_repeat('Long String', 10000);

$counter = 1000;
while ($counter--) {
	file_put_contents('file', $s); // írja ki.
	$readed = file_get_contents('file'); // beolvasás
	if ($s !== $readed) { // ellenőrzés
		echo 'a karakterláncok különböznek!';
	}
}

Úgy tűnhet, hogy a echo 'strings differ!' soha nem fordulhat elő. Ennek az ellenkezője igaz. Próbálja meg ezt a szkriptet egyszerre két böngészőfülben futtatni. A hiba szinte azonnal jelentkezni fog.

Az egyik fül olyan időpontban olvassa be a fájlt, amikor a másiknak még nem volt lehetősége az egészet kiírni, így a tartalom nem lesz teljes.

Ezért a kód nem biztonságos, ha egyszerre többször (azaz több szálban) hajtják végre. Ami nem ritka az interneten, gyakran egy szerver egyszerre nagyszámú felhasználónak válaszol. Ezért nagyon fontos annak biztosítása, hogy az alkalmazás több szálban történő végrehajtás esetén is megbízhatóan működjön (szálbiztos). Ellenkező esetben adatok vesznek el, és nehezen észlelhető hibák lépnek fel.

De mint láthatjuk, a PHP natív fájlolvasási és -írási függvényei nem elszigeteltek és atomikusak.

Hogyan használjuk a SafeStreamet?

A SafeStream biztonságos protokollt hoz létre a fájlok elszigetelt olvasásához és írásához a szabványos PHP-funkciók segítségével. Mindössze annyit kell tennie, hogy a fájlnév előtt megadja a nette.safe:// címet:

file_put_contents('nette.safe://file', $s);
$s = file_get_contents('nette.safe://file');

A SafeStream biztosítja, hogy egyszerre legfeljebb egy szál írhat a fájlba. A többi szál a sorban várakozik. Ha egyetlen szál sem ír, akkor tetszőleges számú szál olvashatja a fájlt párhuzamosan.

A protokollal az összes szokásos PHP-funkció használható, például:

// 'r' azt jelenti, hogy csak olvasásra nyitva
$handle = fopen('nette.safe://file.txt', 'r');

$ini = parse_ini_file('nette.safe://translations.neon');
verzió: 3.0