Rumah > pembangunan bahagian belakang > tutorial php > 文件读写顺序有关问题

文件读写顺序有关问题

WBOY
Lepaskan: 2016-06-13 12:52:03
asal
860 orang telah melayarinya

文件读写顺序问题

本帖最后由 o911016 于 2013-03-13 12:45:07 编辑
<?php<br />
<br />
function read($filename) {<br />
	$fp = fopen($filename, 'rb');<br />
	flock($fp, LOCK_SH);<br />
	$data = @fread($fp, @filesize($filename));<br />
	fclose($fp);<br />
	return $data;<br />
}<br />
function write($filename, $data) {<br />
	$fp = fopen($filename, 'ab');<br />
	flock($fp, LOCK_EX);<br />
	fwrite($fp, $data);<br />
	fclose($fp);<br />
	return mt_rand(1, 999);<br />
}<br />
<br />
$file = './wr.txt'; //原文件是空的<br />
echo 'r1: ', read($file),       '|<br/>';<br />
echo 'w1: ', write($file, 'a'), '|<br/>';<br />
echo 'r2: ', read($file),       '|<br/>';<br />
echo 'w2: ', write($file, 'b'), '|<br/>';<br />
echo 'r3: ', read($file),       '|<br/>';<br />
<br />
?>
Salin selepas log masuk


实际执行之后的结果:
r1: |<br />
w1: 745|<br />
r2: |<br />
w2: 404|<br />
r3: |
Salin selepas log masuk


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

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


------解决方案--------------------
本帖最后由 xuzuning 于 2013-03-13 12:56:42 编辑

真正的原因是文件状态缓存造成 filesize($filename) 始终为 0
function read($filename) {<br />
    $fp = fopen($filename, 'rb');<br />
    flock($fp, LOCK_SH);<br />
    clearstatcache(); //清除文件状态缓存<br />
    $data = @fread($fp, @filesize($filename));<br />
    fclose($fp);<br />
    return $data;<br />
}<br />
function write($filename, $data) {<br />
    $fp = fopen($filename, 'ab');<br />
    flock($fp, LOCK_EX);<br />
    fwrite($fp, $data);<br />
    fclose($fp);<br />
    return $data;//mt_rand(1, 999);<br />
}<br />
 <br />
$file = './wr.txt'; //原文件是空的<br />
file_put_contents($file, ''); //清空源文件<br />
echo 'r1: ', read($file),    '<br><font color='#FF8000'>------解决方案--------------------</font><br><br/>';<br />
echo 'w1: ', write($file, 'a'),    '<br><font color='#FF8000'>------解决方案--------------------</font><br><br/>';<br />
echo 'r2: ', read($file),    '<br><font color='#FF8000'>------解决方案--------------------</font><br><br/>';<br />
echo 'w2: ', write($file, 'b'),    '<br><font color='#FF8000'>------解决方案--------------------</font><br><br/>';<br />
echo 'r3: ', read($file),    '<br><font color='#FF8000'>------解决方案--------------------</font><br><br/>';<br />
readfile($file); //显示一下
Salin selepas log masuk
r1: 
------解决方案--------------------

w1: a
------解决方案--------------------

r2: a
Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan