# 原子操作
用于文件操作的Nette \ Utils \ SafeStram协议保证每个文件操作的原子性和隔离。
为什么它实际上好? 让我们从一个简单的例子开始,我们重复写入相同的字符串到文件,然后读取它:`
~~~
$s = str_repeat('Long String', 10000);
$counter = 1000;
while ($counter--) {
file_put_contents('soubor', $s); // write it
$readed = file_get_contents('soubor'); // read it
if ($s !== $readed) { // check it
echo 'Strings are different!';
}
}
~~~
看起来回声的字符串是不同的! 命令不能被执行。 相反是真的。 尝试在两个浏览器中同时运行此脚本。 错误几乎立即发生。
这是因为当在同一时间(即,在多个线程)重复执行时,代码是不安全的。 这是互联网上没有什么不寻常的,在那里几个人经常连接到一个网站在同一时间。 因此,确保您的应用程序可以一次处理多个线程,这是非常重要的 - 它是线程安全的,因为本机PHP函数不是。 否则,您可以预期数据丢失和奇怪的错误发生。
如何确保,像file_get_contets或fwrite的函数原子性地行为? SafeStream协议提供了一个安全的解决方案,所以我们可以通过标准的PHP函数原子操作文件。 加载Nette Framework时,协议自动可用。 之后,你只需要前缀的文件名nette.safe://:
~~~
$handle = fopen('nette.safe://test.txt', 'x'); // prefix the filename with nette.safe://
fwrite($handle, 'Nette Framework'); // for now, the data is written into a temporary file
fclose($handle); // and only now the file is renamed to test.txt
~~~
你当然可以使用所有熟悉的功能,如:
~~~
file_put_contents('nette.safe://test.txt', $content);
$ini = parse_ini_file('nette.safe://autoload.ini');
~~~
SafeStream保证:
原子性:文件作为一个整体写或根本不写。
隔离:没有人可以开始读取尚未完全写入的文件。
如果您以“a”模式(附加)写入现有文件,SafeStream将创建它的副本,只有在成功写入后,它才会将其重命名为原始名称。 因此,在此模式下写入比在其他模式下更耗资源。
- Nette简介
- 快速开始
- 入门
- 主页
- 显示文章详细页
- 文章评论
- 创建和编辑帖子
- 权限验证
- 程序员指南
- MVC应用程序和控制器
- URL路由
- Tracy - PHP调试器
- 调试器扩展
- 增强PHP语言
- HTTP请求和响应
- 数据库
- 数据库:ActiveRow
- 数据库和表
- Sessions
- 用户授权和权限
- 配置
- 依赖注入
- 获取依赖关系
- DI容器扩展
- 组件
- 字符串处理
- 数组处理
- HTML元素
- 使用URL
- 表单
- 验证器
- 模板
- AJAX & Snippets
- 发送电子邮件
- 图像操作
- 缓存
- 本土化
- Nette Tester - 单元测试
- 与Travis CI的持续集成
- 分页
- 自动加载
- 文件搜索:Finder
- 原子操作