Как реализовать месячную подписку?
Оплатил: к текущей дате прибавили 29 (28+сегодня, т.е. полных - всегда 28 даём) и установили timestamp.
При действиях пользователя - проверяем: текущая дата меньше или равна timestamp, если "ДА" - то привилегия работает, "НЕТ" - период привилегии закончился и ставим флаг "EXPIRED" в БД.
PS: А почему месячная подписка - это 28 дней, а не больше?
Делаем таблицу подписок, в ней дата начала, дата окончания, пользователь.
Никаких расписаний не надо. Тем более можно напороться на случай, когда вы будете менять привелегии у пользователя с подписан на не подписан по расписанию, и в этот момент пользователь будет продлевать подписку. Проверку что пользователь подписан нужно делать каждый раз при запросе привилегий пользователя, путём запроса к таблице описанной выше. Условие = пользователь, плюс текущее время находится между двумя датами. Если запись найдена - есть привилегии.