当用户点击我网页上的链接时,我怎么能这样做呢?它写入一个名为“Count.txt”的.txt文件,该文件只包含一个数字,并在该数字上加1?谢谢。
答案 0 :(得分:3)
如果您放弃任何有效性检查,您可以使用以下简单的方法来执行此操作:
file_put_contents($theCounterFile, file_get_contents($theCounterFile)+1);
<强>增加:强>
在这个线程中有关于并发性的讨论并且应该注意使用数据库和事务处理并发是一个好主意,我强烈建议不要写一堆管道代码来在文件中执行此操作
如果您曾经有过,或者认为您可能在同一时间内有两次对该资源的请求,则应该使用PDO或{{}}}来调查PDO {0}如果你要使用mysql,请使用事务(和mysql或更好)。
但实际上,即使你在相同的微秒内获得两个请求(极不可能),锁定文件的可能性也很小,因为它不会保持打开状态,并且这两个请求可能无法并行处理,无论如何都要锁定。现实检查:您在同一分钟内平均获得的同一资源上有多少次点击?...
答案 1 :(得分:2)
如果你决定做更高级的事情,比如说两个数字,你可能想考虑使用SQLite。它与打开和关闭文件一样快,简单,但更灵活。
答案 2 :(得分:1)
通常这很容易:
$count = (int)file_get_contents('/path/to/Count.txt');
file_put_contents('/path/to/Count.txt', $count++, LOCK_EX);
但是你会遇到使用这段代码的并发问题。在任何竞争条件下生成锁定安全的一种方法是:
$countFile = '/path/to/Count.txt';
$countTemp = tempnam(dirname($countFile), basename($countFile));
$countLock = $countFile . '.lock';
$f_lock = fopen($countLock, 'w');
if(flock($f_lock, LOCK_EX)) {
$currentCount = (int)file_get_contents($countFile);
$f_temp = fopen($countTemp, 'w');
if(flock($f_temp, LOCK_EX)) {
fwrite($f_temp, $currentCount++);
flock($f_temp, LOCK_UN);
fclose($f_temp);
if(!rename($countTemp, $countFile)) {
unlink($countTemp);
}
}
flock($f_lock, LOCK_UN);
fclose($f_lock);
}
答案 3 :(得分:1)
打开文件,锁定文件(非常重要),读取当前的数字,将数字加1,将数字写回文件,释放锁定并关闭文件。
即。类似的东西:
$fp = fopen("count.txt", "r+");
if (flock($fp, LOCK_EX)) { // do an exclusive lock
$num = fread($fp, 10);
$num++;
fseek($fp, 0);
fwrite($fp, $num);
flock($fp, LOCK_UN); // release the lock
} else {
// handle error
}
fclose($fp);
应该有效(未经测试)。