PHP hitcounter добавляет символ перед цифрой для каждого удара - PullRequest
0 голосов
/ 14 февраля 2019

Я застрял в маленькой проблеме.У меня есть 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

Ответ будет оценен

1 Ответ

0 голосов
/ 14 февраля 2019

Используйте Rewind после ftruncate (для его изоляции потребовалось немного усилий)

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

Или вы можете просто использовать rewind вместо ftruncate, что, вероятно, является причиной \0 нулевые байты.Кажется несколько бессмысленным делать и то и другое, так как если вы пишете после перемотки, это все равно стирает файл (если вы не используете a+ append) ...

При просмотре самого первого примера в документе используются оба.

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

В любом случае это было забавно ... спасибо!

...