0

我创建了一个函数来将设置存储到文件中(以可读的方式),以便以后可以通过直接编辑文件来修改设置。

我使用了这里描述的方法。

$data = "<?php return ".var_export($var, true).";";
file_put_contents($filename, $data);

当对文件进行更改的请求数量较少时,似乎工作正常,但是当有多个同时请求时,文件内容充满了语法错误或错误的内容顺序,有时它仍然为空。

我尝试使用file_get_conents(..)第三个参数 LOCK_EX 并fwrite()在使用后使用flock(),但这也导致了同样奇怪的行为。这里发生了什么,我该如何纠正?

4

1 回答 1

0

这里的问题是部分保存。使用flock() 似乎没有帮助,因为它只是设置了咨询锁,并且可以被此处描述的其他进程忽略。

防止部分保存的唯一选择是先将数据写入临时文件,然后用临时文件替换现有文件。

我通过使用 shell 命令移动和替换原始文件来纠正问题。

$data = "<?php return ".var_export($var, true).";";
file_put_contents($filename, $data);
exec("move tempfile ".$filename);  // PHP copy()/rename() seemed to be affected by simultaneous requests.

那些不明白这里发生了什么的人:

当多个并行运行的进程同时读取和修改同一个文件时,某些进程可能会在另一个进程完成写入数据之前读取数据,这有时会导致将错误/不完整的数据放入文件中。

于 2016-08-14T10:01:29.790 回答