我创建了一个功能(以可读方式)将设置存储到文件中,以便以后可以通过直接编辑文件来修改设置。
我使用了这里描述的方法。
$data = "<?php return ".var_export($var, true).";";
file_put_contents($filename, $data);
当没有更少的请求更改文件时,似乎工作正常,但是当有多个同时请求时,文件内容充满语法错误或内容顺序错误,有时它保持为空。
我尝试file_get_conents(..)
与第三个参数LOCK_EX一起使用,并且fwrite()
在使用之后,flock()
但这也导致了同样的怪异行为。这是怎么回事,我该如何纠正?
这里的问题是部分保存。使用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.
那些不了解这里发生了什么的人:
当多个并行运行的进程同时读取和修改同一文件时,某些进程可能会在另一个进程完成写入之前读取数据,这有时会导致将错误/不完整的数据放入文件中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句