如何在 php 上改进这个简单的计数器

How to make improve this simple counter on php

我做了这个简单的计数器

$now = date ("d");
$filename = $now .".txt";

$lastcount="";

if (file_exists($filename))
{
    if (time()-filemtime($filename) > 2 * 86400) {
    } else {
        $lastcount=strval(intval (file_get_contents($filename))+1);
    }
}

file_put_contents($filename, $lastcount);

基本上就是读取一个文件,然后加1,然后重写

问题是在我读取文件和写回文件之间,程序的另一个副本可能读取并写入文件。

那么如何使它成为原子的呢?

我还想确保整个脚本不会 "crash" 因为这个锁定。

那么如何改进这个计数器呢?

您可以使用 flock 锁定文件。使用独占锁定安全地写入文件:

$fp = fopen($filename, "rw");
if (flock($fp, LOCK_EX)) {
    // write here
    // ...

    // release the file
    flock($fp, LOCK_UN);
} else {
    // can't use it yet. Wait a little.
}