Home > Backend Development > PHP Tutorial > 文件读写顺序问题

文件读写顺序问题

WBOY
Release: 2016-06-23 14:02:45
Original
1012 people have browsed it

<?phpfunction read($filename) {	$fp = fopen($filename, 'rb');	flock($fp, LOCK_SH);	$data = @fread($fp, @filesize($filename));	fclose($fp);	return $data;}function write($filename, $data) {	$fp = fopen($filename, 'ab');	flock($fp, LOCK_EX);	fwrite($fp, $data);	fclose($fp);	return mt_rand(1, 999);}$file = './wr.txt'; //原文件是空的echo 'r1: ', read($file),       '|<br/>';echo 'w1: ', write($file, 'a'), '|<br/>';echo 'r2: ', read($file),       '|<br/>';echo 'w2: ', write($file, 'b'), '|<br/>';echo 'r3: ', read($file),       '|<br/>';?>
Copy after login


实际执行之后的结果:
r1: |w1: 745|r2: |w2: 404|r3: |
Copy after login


根据结果发现,执行顺序和PHP语句的顺序不同,
实际上的顺序是“r1 -> r2 -> r3 -> w1 -> w2”。
我试过把读文件所加的锁LOCK_SH改成LOCK_EX,结果还是和上面的顺序一样。

怎样才能让读写顺序符合语句顺序“r1 -> w1 -> r2 -> w2 -> r3”来执行?


回复讨论(解决方案)

真正的原因是文件状态缓存造成 filesize($filename) 始终为 0

function read($filename) {    $fp = fopen($filename, 'rb');    flock($fp, LOCK_SH);    clearstatcache(); //清除文件状态缓存    $data = @fread($fp, @filesize($filename));    fclose($fp);    return $data;}function write($filename, $data) {    $fp = fopen($filename, 'ab');    flock($fp, LOCK_EX);    fwrite($fp, $data);    fclose($fp);    return $data;//mt_rand(1, 999);} $file = './wr.txt'; //原文件是空的file_put_contents($file, ''); //清空源文件echo 'r1: ', read($file),    '|<br/>';echo 'w1: ', write($file, 'a'),    '|<br/>';echo 'r2: ', read($file),    '|<br/>';echo 'w2: ', write($file, 'b'),    '|<br/>';echo 'r3: ', read($file),    '|<br/>';readfile($file); //显示一下
Copy after login
r1: |
w1: a|
r2: a|
w2: b|
r3: ab|
ab


clearstatcache -- 清除文件状态缓存

本函数缓存特定文件名的信息,因此只在对同一个文件名进行多次操作并且需要该文件信息不被缓存时才需要调用 clearstatcache()。 

受影响的函数包括 stat(),lstat(),file_exists(),is_writable(),is_readable(),is_executable(),is_file(),is_dir(),is_link(),filectime(),fileatime(),filemtime(),fileinode(),filegroup(),fileowner(), filesize(),filetype() 和 fileperms()。

明白了,原来是缓存的缘故。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template