代码之家  ›  专栏  ›  技术社区  ›  user

php-打开txt文件,单击链接时向内容添加+1

php
  •  0
  • user  · 技术社区  · 15 年前

    当用户点击我网页上的链接时,它会写一个名为“count.txt”的.txt文件,该文件只包含一个数字,并在该数字上加上1,我该怎么做呢?谢谢您。

    4 回复  |  直到 15 年前
        1
  •  3
  •   Kris    15 年前

    如果您放弃了任何有效性检查,您可以使用以下简单的方法进行检查:

    file_put_contents($theCounterFile, file_get_contents($theCounterFile)+1);
    

    添加:

    在这个线程中有关于并发性的讨论,应该注意的是,使用数据库和事务来处理并发性是一个好主意,我强烈建议不要在一个文件中编写一组管道代码来完成这项工作。

    如果您曾经有过,或者认为您可能在同一秒钟内对资源有两个请求,那么您应该研究一下 PDO 具有 mysql 或PDO SQLite 使用事务(和 InnoDB 或者更好的方法是使用MySQL)。

    但实际上,即使您在同一微秒内收到两个请求(极不可能),锁定文件的可能性也很小,因为它不会保持打开状态,而且两个请求的处理可能不会并行到足以锁定的程度。现实检查:在同一分钟内,你平均在同一个资源上获得多少点击率?…

        2
  •  2
  •   brianegge    15 年前

    如果您决定做一些更高级的事情,比如说两个数字,那么您可能需要考虑使用sqlite。它的速度和打开和关闭文件的速度一样快,也一样简单,但是更灵活。

        3
  •  1
  •   wimvds    15 年前

    打开文件,锁定文件(非常重要),读取当前文件中的编号,在编号中添加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);
    

    应该工作(未测试)。

        4
  •  1
  •   Stefan Gehrig    15 年前

    一般来说,这很容易:

    $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); 
    }