RomAndry пишет:Кстати ссылка на ExBB стоит в копирайтах.
Поскольку ссылка на наш форум поддержки прописана через редирект, формально процитированное утверждение неверно
Александр Михалицын
Реализация кеширования - это очень хорошо. Однако, судя по исходнику, кроме создания кешированной копии подсвеченного кода и в дальнейшем проверки её наличия со считыванием кода из файла, больше по кешированию ничего не сделано. А что делать в случае, если тема, в которой было много исходного кода, была удалена? Или, к примеру, если мне понадобится немного изменить опубликованный ранее код, соответственно изменится его MD5-хеш и будет создан новый файл с кешем, что в этом случае делать со старым? Нужно продумать систему управления кешем, чтобы при удалении тем/сообщений, изменении кода в сообщениях соответственно и удалялись или обновлялись кешированные данные. В противном случае кеш очень быстро замусориться неактуальными данными, которые (что самое обидное) занимают довольно много места на сервере
Александр Михалицын пишет:
Ну мне не очень смешно.
Проверил мод, несколько раз подряд правил код в сообщении, после чего нажимал кнопку
Предварительный просмотр. Итог - в папке кеша столько файлов, сколько раз была нажата эта кнопка, а ведь сообщение в конце концов даже не опубликовал, эти файлы остались на сервере, хотя данный кеш более не актуален
Мне кажется, принцип хранения кеша подсвеченного кода нужно реализовать по-другому и у меня есть 2 варианта предложения реализации
Первый в виде файловой структуры (структуры папок)
кеш/раздел/тема/сообщение. Например, для темы с
id=1 в разделе с
id=2 будет создана папка
highlight_code_cache/forum2/topic1, внутри которой будут создаваться файлы вида
123456789.php, где
123456789 - id сообщения, в каждом из подобных файлов будет храниться кеш для всего подсвеченного кода, имеющегося в данном сообщении. В дальнейшем управлять таким кешем просто, скажем, если мы удаляем тему, то не нужно парсить её сообщения, заного вычислять MD5-хеш всех встречающихся в ней вставок кода, достаточно просто удалить папку
highlight_code_cache/forum2/topic1. Тоже самое справедливо и при удалении отдельных сообщений, или даже целых разделов. При этом необходимо реализовать своего рода период действия кеша, чтобы по истичении 1-2 дней с момент создания кеша код перекешировался (это на случай обновления библиотеки geshi и т.п.)
Второй вариант - сохранить уже имеющуся сейчас систему кеширования, но вынести список всех кешированных файлов в отдельный файл произвольного доступа. Тогда можно написать отдельный скрипт, который будет запускаться кроном через определённые промежутки времени и пробегаться за один запуск по некоторой части файлов кеша, сравнивая время последнего доступа к файлу (см.
fileatime()) и удаляя давно невостребованный кеш. Принцип действия прост, при парсинге кода мы вычисляем его MD5-хеш, создаём кеш и помещаем MD5-хеш кода (а этот хеш есть имя файла кеша) в список файла произвольного доступа. Далее скрипт чистки запускается кроном, считывает некоторую часть списка (это важно - считывать именно часть списка, поэтому я упоминаю файл произвольного доступа, сериализацию здесь применить нельзя, тут скорее нужно применить метод, аналогичный сохранению структур в бинарные файлы на Си), сравнивает даты последнего доступа к ним и при необходимости удаляет. Можно в принципе дату последнего обращения к файлу кеша также хранить средствами скрипта (это я к тому, что на некоторых серверах и файловых системах использование fileatime() невозможно). Вариант со связкой opendir() + readdir() и подобные им не рассматриваем, т.к. при таком переборе во-первых значительно расходуются ресурсы, а во-вторых довольно сложно перейти в произвольную часть списка файлов, до которой не дошла проверка в предыдущий раз
У каждого варианта свои преимущества и недостатки, высказывайте своё отношение к ним и предлагайте свои идеи