PHP Counter
Выложил на github.com свой класс Counter.
В основном сделал это, чтобы потестить сам GitHub.
Адрес страницы на гитхабе: http://github.com/valmat/MC_Counter
Класс Counter
— это образец реализации счетчика на memcache.
Можно построить другие реализации на общем интерфейсе.
Сохранение результатов применения значений счетчика осуществляется по заданному числу.
Можно реализовать сохранение по заданному интервалу времени.
- Конструктор принимает три аргумента: ключ, имя слота и идентификатор для инициализации слота.
- Для чего это сделано: инкремент счетчика должен быть очень быстрой операцией.
- Не целесообразно тратить время и системные ресурсы на создание объектов, которые не будут использованы.
- Поэтому передается только имя класса слота, который создается только в случае необходимости.
- К таким случаям относится обмен данными между локальным и постоянным хранилищем счетчика.
- Слоты необходимы, так как Counter не может знать о способе хранения данных в постоянном хранилище и путях доступа к ним.
- Для предотвращения состояния гонки необходим механизм блокировок.
- При наличии блокировки процессы, не получившие эксклюзивные права на получение данных, будут писать во временное хранилище, а процесс, установивший блокировку, по окончании своей работы инкрементирует счетчик данными из временного хранилища.
- При сбросе данных в постоянное хранилище по условию достижения кратности значения счетчика (
$this->Val % $this->upd_delim
), блокировка не требуется, так как в этом случае (при достаточно большом значении$this->upd_delim
) в текущий момент времени только один процесс приходит к необходимости сброса данных.
$cnt = new Counter('anykey', 'AnySlot', 15);
echo $cnt->increment();
echo $cnt->get();
echo $cnt->set(11);