【发布时间】:2013-08-14 15:56:31
【问题描述】:
我有一个网页,我想在不使用数据库的情况下跟踪它的访问次数。
我想到了 XML,每次用户访问页面时都会更新一个文件:
<?xml version='1.0' encoding='utf-8'?>
<counter>8</counter>
然后我认为在一个单独的文件中声明一个 PHP 计数器然后在每次用户访问该页面时更新它可能是一个更好的主意。
counter.php
<?php
$counter = 0;
?>
update_counter.php:
<?php
include "counter.php";
$counter += 1;
$var = "<?php\n\t\$counter = $counter;\n?>";
file_put_contents('counter.php', $var);
?>
这样,每次访问update_counter.php 时,counter.php 文件中的变量都会递增。
无论如何,我注意到如果 counter.php 文件具有 $counter = 5 并且 update_counter.php 文件被 1000 个用户同时访问,则该文件同时被读取 1000 次(所以值 5 在所有请求中被读取)counter.php 文件将更新为值 5+1 (=6) 而不是 1005。
有没有办法让它在不使用数据库的情况下工作?
【问题讨论】:
-
你会想看看
flock()php.net/manual/en/function.flock.php -
@ChristopherMorrissey 我真的不知道这个功能,你能解释一下它是什么以及如何在答案中使用它吗?
-
我认为要使用
flock(),您必须阅读文件而不是包含它。它会添加一些代码,但不会太难。问题可能在于您必须在锁定文件之前打开文件,并且可能有多个用户在获得锁之前打开它(意味着多个用户将读取相同的初始值) -
@MichaelWheeler 如果文件被锁定,这是否意味着如果文件被打开,另一个脚本打开它的请求被拒绝?还是其他脚本只会等待锁被释放?
-
添加这个作为答案,因为我没有足够的声誉来评论 - 实际上在 cmorrissey 的答案中的 ftruncate() 之后,需要插入以下行以确保在开始时写入文件。否则,无关的空值将阻止所需的结果。倒带($fp);