PHP сбрасывается число в кэше

191
13 августа 2018, 01:50

Сделал элементарный подсчёт просмотров страниц:

$cache = json_decode(fgets(fopen('/home/user/site.com/assets/cache.tmp', 'r')), true);
//добавляем к количеству счетчика +1
$cache['counter'][$_POST['type']] = strval($count = $cache['counter'][$_POST['type']] +1); 
fwrite(fopen('/home/user/site.com/assets/cache.tmp', 'w'), json_encode($cache));

Но дело в том что число раз в день не по понятным мне причинам сбрасывается. Изначально было 4700000 (взято из прошлых данных). Сегодня в обед захожу и вижу такое содержимое файла:

{"counter"
:{
"ch":"41"}
}

А должно быть ch: ~4702930

Укажите пожалуйста в чем это может быть проблема? Из-за большого числа? - Так вроде же перевёл в strval.

Answer 1

Вероятнее всего, при чтении файла происходят ошибки, которые вы не проверяете. В результате переменная $cache у вас получается пустой.

Попробуйте такой код

function inc_counter($file_name, $type) {
  $data = file_get_contents($file_name);
  if ($data === false)
    return false;
  $json = json_decode($data, true);
  if ($json === null)
    return false;
  $json['counter'][$type]++;
  $data = json_encode($json);
  if ($data === false)
    return false;
  return file_put_contents($file_name, $data, LOCK_EX) !== false;
}
inc_counter('/home/user/site.com/assets/cache.tmp', $_POST['type']);

А еще лучше использовать БД, где все блокировки уже реализованы

READ ALSO
CMake не видит компилятора

CMake не видит компилятора

Поставил CMake (без CLang), добавил в переменную path путь к cmake-39

202
Ошибка при компиляции на XCode

Ошибка при компиляции на XCode

Уже несколько дней не могу разобраться с проблемой, вот код:

159
Зачем нужен std::invoke?

Зачем нужен std::invoke?

Увидел сейчас, что в 17ом стандарте появилась новая шаблонная функция std::invokeОчень сильно обрадовался, т

183