ホームページ > バックエンド開発 > PHPチュートリアル > ファイルの読み取りと書き込みの順序に関する問題

ファイルの読み取りと書き込みの順序に関する問題

WBOY
リリース: 2016-06-13 12:52:03
オリジナル
852 人が閲覧しました

ファイルの読み取りと書き込みの順序の問題

この投稿は 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:
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート