nette / safe-stream
Nette SafeStream:通过原生PHP函数提供对文件的安全隔离操作。
v3.0.1
2023-08-05 18:54 UTC
Requires
- php: 8.0 - 8.3
Requires (Dev)
- nette/tester: ^2.4
- phpstan/phpstan: ^0.12
- tracy/tracy: ^2.8
README
简介
SafeStream 保证对文件的每个读写操作都是隔离的。这意味着没有任何线程会开始读取尚未完全写入的文件,或者多个线程不会覆盖同一个文件。
安装
composer require nette/safe-stream
它有什么好处?
隔离操作究竟有什么好处?让我们从一个简单的例子开始,该例子重复写入文件并从中读取相同的字符串。
$s = str_repeat('Long String', 10000); $counter = 1000; while ($counter--) { file_put_contents('file', $s); // write it $readed = file_get_contents('file'); // read it if ($s !== $readed) { // check it echo 'strings are different!'; } }
似乎 echo 'strings differ!'
永远不会发生。相反,这是真的。尝试在两个浏览器标签页中同时运行此脚本。错误几乎会立即发生。
其中一个标签页将在另一个标签页还没有机会写入所有内容时读取文件,因此内容将不完整。
因此,如果代码被多次同时执行(即在多个线程中),则代码是不安全的。在互联网上,这并不少见,通常服务器会在同一时间响应大量用户。因此,确保您的应用程序即使在多线程执行时也能可靠地工作(线程安全)非常重要。否则,数据将会丢失,并且会发生难以检测的错误。
但是,如您所见,PHP的原生文件读写函数并不是隔离和原子的。
如何使用 SafeStream?
SafeStream 通过使用标准PHP函数创建一个安全的协议来隔离读写文件。您需要做的只是指定 nette.safe://
在文件名之前。
file_put_contents('nette.safe://file', $s); $s = file_get_contents('nette.safe://file');
SafeStream 确保最多只有一个线程可以同时写入文件。其他线程将在队列中等待。如果没有线程在写入,任何数量的线程都可以并行读取文件。
可以使用此协议使用所有常见的PHP函数,例如
// 'r' means open read-only $handle = fopen('nette.safe://file.txt', 'r'); $ini = parse_ini_file('nette.safe://translations.neon');