2

我已经用 PHP 编写了一个程序来增加文本文件中的值,但有人告诉我,当多个用户同时使用同一个 PHP 脚本时,这可能会变坏。

有人知道如何解决这个问题或更好的方法吗?我所需要的只是计算一个按钮的点击次数并以某种方式保存它们并在另一个页面中显示它。

这是我的代码:

<?php

    $clicks = file_get_contents("clicks.txt");
    $clicks++;

        $fp = fopen("clicks.txt", "w+");
        fwrite($fp, $clicks);
        fclose($fp);

//give the count to the user
echo "result: $clicks";

    ?>
4

4 回答 4

0

它可能变坏的原因是当两件事试图同时写入文件时。您可以通过在写入文件之前锁定文件来避免这种情况。PHP 有flock.

获得排他锁LOCK_EX将允许您写入文件,但没有其他人。因此,如果您这样做,则只有一个脚本实例可以随时写入。如果脚本无法获得锁定,则意味着其他内容正在写入文件,因此您可以再次尝试或抛出错误。

来自 PHP 文档的示例flock

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

对于任何现实世界的应用程序,您将使用数据库并为您想要监控的每次点击插入一行。您还可以存储有关每次点击的更多信息,例如时间、用户所在的页面以及您可能想要的任何其他信息。然后您可以查询数据库并获取所有这些统计信息。您将完全避免这个问题。

更新:阅读此页面以获取教程。

于 2012-06-16T21:06:49.500 回答
0

使用数据库。例如,Mysql 可以为您的数据库事务提供 ACID 保证。

于 2012-06-16T21:07:33.480 回答
0

在我看来,关于计算点击次数的最佳方法的问题的答案是使用免费的谷歌分析帐户。

如果您坚持自己做,则需要将每次点击的信息记录到数据库中,然后将这些数据转化为有趣的可视结果。

如果你不愿意做这两件事,那么你的有效率就会急剧下降,在这种情况下,你已经使用的方法已经是最好的方法了,因为你的范围很窄。

于 2012-06-16T21:21:08.867 回答
-1

如果您不介意刷新页面,那么只需发送一个带有隐藏字段的表单并在数据库中增加一个数字。

如果您不想刷新页面以保存单击,那么只需向服务器发出 AJAX 请求并再次执行相同的操作 - 如果您愿意,可以将其保存为数据库或文件。

于 2012-06-16T21:04:01.623 回答