PHP hitcounter为每个匹配在数字前添加符号

问题描述 投票:1回答:1

我遇到了一个小问题。我有一个php页面:

的index.php

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
include( 'counter.php' );
?>
</body>
</html>

和文件counter.php

<?php
$fp = fopen("counter.txt", "r+");

if(!$fp){
    error_log("Could not open counter.txt");
    exit();
}

if(!flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    error_log("Could not lock");
}
else{
    $counter = intval(fread($fp, filesize("counter.txt")));
    $counter++;

    echo $counter;
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, $counter);  // set your data
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
}
fclose($fp);
?>

和文件counter.txt,其内容为“0”(0)

运行index.php一次后,文本文件内容变为^ @ ^ @ 1,之后变为^ @ ^ @ ^ @ 1

我想要的是0成为1,然后是2

代码有什么问题吗?

它运行在Ubuntu 18上,使用Apache,并且拥有权限的文件

-rw-rw-r-- 1 emanuel www-data  559 Feb 13 21:56 counter.php
-rw-rw-r-- 1 emanuel www-data   11 Feb 13 22:51 counter.txt
-rw-rw-r-- 1 emanuel www-data  128 Feb 13 22:50 index.php
drwxrwxr-x 2 emanuel www-data 4096 Feb 12 14:55 software

答案将不胜感激

php fopen fwrite flock hitcounter
1个回答
3
投票

在ftruncate之后使用Rewind(做了一些工作来隔离它)

    ftruncate($fp, 0);      // truncate file
    rewind($fp); //rewind the pointer

或者你可以使用rewind而不是ftruncate,这似乎是\0 null字节的原因。做这两件似乎有点无意义,好像你在倒带后写了它无论如何擦除文件(除非你使用a+附加)...

查看文档,第一个示例使用两者。

http://php.net/manual/en/function.ftruncate.php

来自PHP.net

<?php
$handle = fopen('output.txt', 'r+');

fwrite($handle, 'Really long sentence.');
rewind($handle);
fwrite($handle, 'Foo');
rewind($handle);

echo fread($handle, filesize('output.txt'));

fclose($handle);
?>

虽然原因没有解释...我只是使用rewind()但我总是很懒,所以我努力编写我需要的最少量的代码,因为我写了很多代码。

另一种方法

在使用intval之前修剪文件的内容

  $counter = intval(trim(fread($fp, filesize("counter.txt"))));

在记事本++中

  [null][null]1

enter image description here

无论如何这是一个有趣的...谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.