开发者

Read and write to a file while keeping lock

开发者 https://www.devze.com 2022-12-23 04:28 出处:网络
I am making a simple page load counter by storing the current count in a file. This is how I want to do this:

I am making a simple page load counter by storing the current count in a file. This is how I want to do this:

  1. Lock the file (flock)
  2. Read the current count (fread)
  3. Increment it (++)
  4. Write new count (fwrite)
  5. Unlock file/close it (flock/fclose)

Can this be done without losing the lock?

As I understand it, the file can't be written to without losing the lock. The only way I have come up with t开发者_Python百科o tackle this, is to write a character using "r+" mode, and then counting characters.


As said, you could use FLock. A simple example would be:

//Open the File Stream
$handle = fopen("file.txt","r+");

//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
    $count = fread($handle, filesize("file.txt"));    //Get Current Hit Count
    $count = $count + 1;    //Increment Hit Count by 1
    ftruncate($handle, 0);    //Truncate the file to 0
    rewind($handle);           //Set write pointer to beginning of file
    fwrite($handle, $count);    //Write the new Hit Count
    flock($handle, LOCK_UN);    //Unlock File
} else {
    echo "Could not Lock File!";
}

//Close Stream
fclose($handle);


I believe you can achieve this using flock. Open a pointer to your file, flock it, read the data, write the data, then close (close automatically unlocks).

http://php.net/flock


Yes, you have to use rewind before ftruncate. Otherwise, the old content of the file is only refilled with zeros.

The working sequence is:

    fopen
    flock LOCK_EX
    fread filesize
    rewind
    ftruncate 0
    fwrite 
    flock LOCK_UN
    fclose
0

精彩评论

暂无评论...
验证码 换一张
取 消