如何在 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.
}
我做了这个简单的计数器
$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.
}