php 写入文件产生语法错误和内容顺序错误的输出
php writing to a file produces output with syntax errors and wrong order of contents
我创建了一个将设置存储到文件(以可读方式)的功能,以便以后可以通过直接编辑文件来修改设置。
我使用了描述的方法here。
$data = "<?php return ".var_export($var, true).";";
file_put_contents($filename, $data);
当对文件进行更改的请求较少时似乎工作正常,但当有多个同时请求时,文件内容充满语法错误或内容顺序错误,有时它仍然是空的。
我尝试在使用 flock()
之后将 file_get_conents(..)
与第三个参数 LOCK_EX 和 fwrite()
一起使用,但这也导致了同样的奇怪行为。这里发生了什么,我该如何纠正?
这里的问题是部分保存。使用 flock() 似乎没有帮助,因为它只是设置咨询锁,并且可以被其他进程忽略,如 here.
所述
防止部分保存的唯一方法是先将数据写入临时文件,然后用临时文件替换现有文件。
我通过使用 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.
那些不明白这里发生了什么的人:
当多个进程同时读取和修改同一文件时 运行 一些进程可能会在另一个进程完成写入数据之前读取数据,这有时会导致 wrong/incomplete 数据被放入文件.
我创建了一个将设置存储到文件(以可读方式)的功能,以便以后可以通过直接编辑文件来修改设置。
我使用了描述的方法here。
$data = "<?php return ".var_export($var, true).";";
file_put_contents($filename, $data);
当对文件进行更改的请求较少时似乎工作正常,但当有多个同时请求时,文件内容充满语法错误或内容顺序错误,有时它仍然是空的。
我尝试在使用 flock()
之后将 file_get_conents(..)
与第三个参数 LOCK_EX 和 fwrite()
一起使用,但这也导致了同样的奇怪行为。这里发生了什么,我该如何纠正?
这里的问题是部分保存。使用 flock() 似乎没有帮助,因为它只是设置咨询锁,并且可以被其他进程忽略,如 here.
所述防止部分保存的唯一方法是先将数据写入临时文件,然后用临时文件替换现有文件。
我通过使用 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.
那些不明白这里发生了什么的人:
当多个进程同时读取和修改同一文件时 运行 一些进程可能会在另一个进程完成写入数据之前读取数据,这有时会导致 wrong/incomplete 数据被放入文件.