PHP-打开TXT文件,添加+;单击链接时,将1添加到内容
当用户单击我网页上的链接时,它会写入一个名为“Count.txt”的.txt文件,该文件只包含一个数字,并在该数字上加1,我怎么能做到这一点呢?谢谢。如果您放弃任何有效性检查,您可以使用以下简单的方法:PHP-打开TXT文件,添加+;单击链接时,将1添加到内容,php,Php,当用户单击我网页上的链接时,它会写入一个名为“Count.txt”的.txt文件,该文件只包含一个数字,并在该数字上加1,我怎么能做到这一点呢?谢谢。如果您放弃任何有效性检查,您可以使用以下简单的方法: file_put_contents($theCounterFile, file_get_contents($theCounterFile)+1); 添加: 在这个线程中有关于并发性的讨论,应该注意的是,使用数据库和事务来处理并发性是一个好主意,我强烈建议不要在文件中编写一堆管道代码来实现这一点
file_put_contents($theCounterFile, file_get_contents($theCounterFile)+1);
添加:
在这个线程中有关于并发性的讨论,应该注意的是,使用数据库和事务来处理并发性是一个好主意,我强烈建议不要在文件中编写一堆管道代码来实现这一点
如果您曾经,或者认为您可能曾经在同一秒钟内有两个对资源的请求,那么您应该使用PDO而不是文件,使用事务(如果您使用mysql,则更好)
但实际上,即使您在同一微秒内收到两个请求(可能性很小),锁定该文件的可能性也很小,因为它不会保持打开状态,而且这两个请求可能不会被并行处理到足以锁定的程度。现实检查:在同一分钟内,你平均在同一资源上获得多少点击率?…通常这很容易:
$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);
}
如果你决定做任何更高级的事情,比如说两个数字,你可能想考虑使用SQLite。它与打开和关闭文件一样快速和简单,但更灵活。打开文件,锁定文件(非常重要),读取其中当前的数字,将数字加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);
应该可以工作(未经测试)。SQLite显然比使用文本文件好得多。当多个用户同时连接时,这将失败,您需要锁定。请参阅Wim Vandermissen的答案。是的,如果您需要某种可行的并发性,那么它将失败。请使用数据库,而不是文本文件。您忘记了为
文件内容指定文件名。
。您究竟为什么要自己编写这些内容,只需重新请求并写入int?因为在网站上,您可以同时访问该文件,如果不锁定和解锁该文件,您的计数器将关闭或损坏。您确定这是您想要的吗?听起来你只是想记录你的访客。还有很多其他东西可能更适合你的目的,比如AwStats或Google Analytics。我想做的是跟踪我的一个程序的下载次数。我从未使用过MySQL或其他任何东西,并且有基本的PHP知识。