この投稿は 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 />
?>
ログイン後にコピー
実際の実行後の結果:
r1: |<br />
w1: 745|<br />
r2: |<br />
w2: 404|<br />
r3: |
ログイン後にコピー
結果によると、実行順序は 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); //显示一下
ログイン後にコピー
r1:
------解決策------------- -- -----
w1: a
------解決策---------
r2: