Обновлён
открытый репозиторий, содержащий все файлы движка кроме собственно игры. Можно увидеть, что изменений была масса: теперь используются пространства имён (я так надеялась, что их доработают в ближайших версиях PHP, но приходится работать с тем, что есть), выделены в отдельный класс типы данных ValueType, добавлены регистры данных RegisterSet, приостанавливаемые методы Coroutine, много функционала пересажено на интерфейсы вместо классов (в частности, на Promise)... Долго рассказывать.
Что делается сейчас. Сегодня мне нужно решить проблему запекания шаблонов.
Шаблон - это текстовая заготовка, которая превращается затем для пользователя в кусок веб-страницы. Например: "Покемон {{имя}}, вид {{вид}}, тренер {{тренер.имя}}, ур. {{уровень}}". При подстановке конкретного покемона в этот шаблон мы получаем "Покемон Вася, вид бульбазавр, тренер EvilCat, ур.10". Шаблоны могут быть довольно большими и включать сценарии ("если покемон в яйце, показать одно... если вылупившийся, другое...") и подшаблоны.
Если на странице показывается 20 покемонов - это двадцать шаблонов с информацией о них. В которых могут быть подшаблоны. И у самой страницы - тоже. В общем, это гибкая система, но также и нагрузная. Поэтому хорошая практика - хранить результат раскрытия затратных шаблонов в кэше, то есть на диске или в памяти. Тогда вместо заполнения каждого отдельного поля {{имя}}, {{вид}}... Нужно просто достать готовый текст о бульбазавре Васе.
Не всё так просто, конечно. Что если тренер переименует покемона, а игра продолжит показывать готовый текст, где он всё ещё Вася? Что если админы переименуют вид покемона? Игра должна знать, когда "сбрасывать кэш" - забывать готовые тексты и делать их заново. Отчасти она делает это по времени, очищая кэш где-то раз в сутки. Но на некоторые изменения реакция должна быть мгновенной. Также не имеет смысл включать в готовый текст значение опыта {{xp}}, поскольку он будет меняться сиюминутно и сбрасывать в остальном годный кэш. Это значение должно остаться незаполненным полем. Также нет смысла хранить готовые тексты для шаблонов, где не так уж много полей... В общем, все эти нюансы необходимо учесть в коде, чтобы сайт работал быстро даже под большой нагрузкой.