SafeStream : Sécurité des fichiers

Nette SafeStream garantit que chaque lecture et écriture dans un fichier est isolée. Cela signifie qu'aucun thread ne commencera à lire un fichier qui n'est pas encore entièrement écrit, ou que plusieurs threads n'écraseront pas le même fichier.

Installation :

composer require nette/safe-stream

A quoi ça sert ?

À quoi servent réellement les opérations isolées ? Commençons par un exemple simple qui écrit de manière répétée dans un fichier et lit ensuite la même chaîne de caractères :

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

$counter = 1000;
while ($counter--) {
	file_put_contents('file', $s); // l'écrire
	$readed = file_get_contents('file'); // le lire
	if ($s !== $readed) { // vérifiez-le
		echo 'les chaînes sont différentes!';
	}
}

Il peut sembler que echo 'strings differ!' ne puisse jamais se produire. C'est pourtant le contraire qui est vrai. Essayez d'exécuter ce script dans deux onglets du navigateur en même temps. L'erreur se produira presque immédiatement.

L'un des onglets lira le fichier à un moment où l'autre n'aura pas eu le temps de tout écrire, et le contenu ne sera donc pas complet.

Par conséquent, le code n'est pas sûr s'il est exécuté plusieurs fois en même temps (c'est-à-dire dans plusieurs threads). Ce qui n'est pas rare sur l'internet, un serveur répondant souvent à un grand nombre d'utilisateurs en même temps. Il est donc très important de s'assurer que votre application fonctionne de manière fiable même lorsqu'elle est exécutée dans plusieurs threads (thread-safe). Sinon, des données seront perdues et des erreurs difficiles à détecter se produiront.

Mais comme vous pouvez le constater, les fonctions natives de lecture et d'écriture de fichiers de PHP ne sont pas isolées et atomiques.

Comment utiliser SafeStream ?

SafeStream crée un protocole sécurisé pour lire et écrire des fichiers de manière isolée en utilisant des fonctions PHP standard. Tout ce que vous avez à faire est de spécifier nette.safe:// avant le nom du fichier :

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

SafeStream garantit qu'au maximum un thread peut écrire dans le fichier à la fois. Les autres threads sont en attente dans la file d'attente. Si aucun thread n'écrit, un nombre quelconque de threads peut lire le fichier en parallèle.

Toutes les fonctions PHP courantes peuvent être utilisées avec le protocole, par exemple :

// 'r' signifie ouvrir en lecture seule
$handle = fopen('nette.safe://file.txt', 'r');

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