PHP计数器只覆盖/溢出1字节的数据,计数器复位(竞争条件)


PHP Counter overwraps/overflows only 1 byte of data, counter resets (race condition)

我知道这是一个简单的问题,但我从http://www.stevedawson.com/scripts/text-counter.php下载了一个PHP计数器脚本

这是第一个结果在谷歌的PHP计数器脚本,它工作得很好,如预期的

我试图通过在255个请求后在浏览器中保持刷新来查看它是否出错,它溢出回0。我该如何修复这个脚本?我认为罪魁祸首是filesize()它可能只得到1字节的数据但这没有意义因为255实际上是3 bytes的数据,对吧?因为它保存在纯文本格式?

为什么会溢出?即使是PHP,它也不应该溢出,而应该自动变异成更大的数据类型。

<?php
    $orderCountFile = "order_num_count.txt";
    if (file_exists($orderCountFile)) {
        $fil = fopen($orderCountFile, r);
        $dat = fread($fil, filesize($orderCountFile)); 
        echo $dat+1;
        fclose($fil);
        $fil = fopen($orderCountFile, w);
        fwrite($fil, $dat+1);
    } else {
        $fil = fopen($orderCountFile, w);
        fwrite($fil, 1);
        echo '1';
        fclose($fil);
    }
?>

是的,我开始重制脚本到另一个目的,我想用它来跟踪我的网站的订单号码。

对于一个修复,我认为我必须将$dat转换成一个更大的整数类型,但你甚至可以在PHP中转换吗?

还有那些rw应该是字符串,我认为,但它们被用作常量,但它似乎不会引起任何麻烦。

使用file_get_contentsfile_put_contents代替。您仍然需要考虑,该计数器也有一个硬限制(参见PHP_INT_MAX),但它明显更高。

<?php
$file = "counter.txt";
$counter = 0;
if (file_exists($file)) {
  $counter = file_get_contents($file);
}
$counter = $counter + 1;
file_put_contents($file, $counter);
echo $counter;