Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-打开TXT文件,添加+;单击链接时,将1添加到内容_Php - Fatal编程技术网

PHP-打开TXT文件,添加+;单击链接时,将1添加到内容

PHP-打开TXT文件,添加+;单击链接时,将1添加到内容,php,Php,当用户单击我网页上的链接时,它会写入一个名为“Count.txt”的.txt文件,该文件只包含一个数字,并在该数字上加1,我怎么能做到这一点呢?谢谢。如果您放弃任何有效性检查,您可以使用以下简单的方法: file_put_contents($theCounterFile, file_get_contents($theCounterFile)+1); 添加: 在这个线程中有关于并发性的讨论,应该注意的是,使用数据库和事务来处理并发性是一个好主意,我强烈建议不要在文件中编写一堆管道代码来实现这一点

当用户单击我网页上的链接时,它会写入一个名为“Count.txt”的.txt文件,该文件只包含一个数字,并在该数字上加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知识。