Я застрял в небольшой проблеме. У меня есть 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
Ответ был бы оценен
Используйте Rewind после ftruncate (потребовалось немного усилий, чтобы изолировать его)
ftruncate($fp, 0); // truncate file
rewind($fp); //rewind the pointer
Или вы можете просто использовать rewind
вместо ftruncate
что, кажется, является причиной \0
нулевые байты. Кажется несколько бессмысленным делать и то и другое, как будто вы пишете после перемотки, так или иначе стирает файл (если вы не используете 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
Во всяком случае, это было весело … спасибо!
Других решений пока нет …