Счетчик в PHP вернулся к 0 после 32 768 (высокая вероятность), но только один раз - PullRequest
1 голос
/ 01 ноября 2019

Давным-давно я создал веб-сайт и в нем есть счетчик количества людей, скачавших мое приложение. Теперь я вижу счетчик ревертера до нескольких сотен, пока он был выше 30000. Я предполагаю, что счетчик составляет всего 2 байта.

Я не очень разбираюсь в PHP, но я догадался, что (int) приведение вызывает проблему.

<?php
if(!file_exists('Counters/counter_installer.txt')){
  file_put_contents('Counters/counter_installer.txt', '0');
}
if($_GET['click_installer'] == 'yes'){
  file_put_contents('Counters/counter_installer.txt', ((int) file_get_contents('Counters/counter_installer.txt')) + 1);
  header('Location: ' . 'http://www.example.com/Releases/foobar.3.1.0.exe');
  die;
}

Итак, я изменил (int) на long, но, поскольку кажется, что PHP долго не работает, страница не может быть загружена, поэтому я вернул ее обратно.

Чем я изменил содержимое файла (196) на 32964 (= 32768 + 196) и обнаружил, что он снова начал увеличиваться (когда я нажал кнопку загрузки).

Итак, один раз,счетчик вернулся (к 0?) Я предполагаю, и у меня нет понятия, почему.

Это связано с целым / 2-байтовым значением? Или что-то еще?

1 Ответ

4 голосов
/ 01 ноября 2019

Файловые счетчики чрезвычайно сложны для правильной настройки в многопользовательских средах, и вы не проверяете ошибки. Простейшим исправлением будет правильная база данных любого рода (серьезно). Если это невозможно, вам нужно как минимум учесть параллелизм и прервать обновление счетчика с поврежденными данными. Вы можете проверить flock () в качестве отправной точки.

...