みなさんおはようございます。
私は少し立ち往生しています。特定の条件下でのみファイルを開いて空にする方法はありますか?
1. fopen(file)-> flock->ファイルの内容を読み取る2.
特定の条件が満たされた場合は、ファイルの内容を置き換えます
3.ロックを解除してfclose
問題は次のとおりです。
fopen (file, w+)
事前にファイルを空にします。だから私はコンテンツを読むことができません私が
fopen (file, r+)
それに書き込みたい場合はファイルを空にしません
ftruncate($fn,0)
と組み合わせて試しましr+
たが、ファイルに「null」が書き込まれます
。回避策は、最初にファイルの内容を読み取り、次にそれを開くことです。しかし、私は読んだ瞬間から終了するまでファイルのロックを維持しようとしています。
誰かアイデアはありますか?
編集:
問題はのようfwrite
です。
ftruncate
ファイルをクリアしますがfwrite
、「nul」を追加します。100回のパスの後、データの前に100個の「nul」があります
$pt = "../path/file";
$fn = lock_file($pt);
$i = fread($fn,100);
ftruncate($fn,0);
fwrite($fn,"data");
fflush($fn);
flock($fn, LOCK_UN);
fclose($fn);
function lock_file($file){
$fn = fopen($file, "c+");
$try=0;
do{
if($try>0){usleep(rand(1,10000));}
$try ++;
}
while(!flock($fn, LOCK_EX | LOCK_NB) and $try <= 300);
if($try>=300){return FALSE;}
return $fn;
}
fseek($fn, 0);
おかげで解決しました!