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

WBOY
リリース: 2016-06-23 14:02:45
オリジナル
979 人が閲覧しました

<?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/>';?>
ログイン後にコピー


実際に実行した結果:
r1: |w1: 745|r2: |w2: 404|r3: |
ログイン後にコピー


結果によると、実行順序は PHP ステートメントの順序とは異なることがわかります
実際の順序は、「r1 -> r2 -> r3」です。 -> w1 -> w2」
ファイル読み取り用のロックを LOCK_SH から LOCK_EX に変更してみましたが、結果は上記のシーケンスと同じでした。

読み取りと書き込みの順序を、実行時のステートメントの順序「r1 -> w1 -> r2 -> w2 -> r3」に準拠させるにはどうすればよいですか?


ディスカッションへの返信 (解決策)

本当の理由は、ファイル ステータス キャッシュにより filesize($filename) が常に 0 になることです。 |

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()。


わかりました。キャッシュが原因であることがわかりました。

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