Интересное наблюдение за кешированием страниц

Главные вкладки

Аватар пользователя Sinkora Sinkora 3 июня 2010 в 18:11

Раньше не обращал внимание. Но вчера заметил, что при стандартном кешировании Друпал сохраняет в кеш несуществующие страницы.

Например, у нас есть сайт example.com, на котором имеются следующие страницы:

example.com/catalog
example.com/catalog?page=1
example.com/catalog?page=2
...
example.com/catalog?page=1000

Т.е. Друпал кеширует эти страницы через cache_set($base_root . request_uri(), $data, 'cache_page', CACHE_TEMPORARY, drupal_get_headers());. Но проверку на существование страницы request_uri() не делает...

И если мы будем запрашивать несуществующие страницы, например:

example.com/catalog?page=1001
example.com/catalog?page=1002
...
и так до бесконечности,

то Друпал будет сохранять в таблицу cache_page весь этот хлам. В качестве сохраняемых данных будет браться запись из последней существующей страницы (example.com/catalog?page=1000).

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

Таких примеров можно привести очень много.

Комментарии

Аватар пользователя Sinkora Sinkora 4 июня 2010 в 1:18

"xxandeadxx" wrote:
по крону эта таблица очищается

Понятное дело.

Но крон же не запускают каждую минуту. Да и кешированные данные, которые не меняются, нужно максимально долго хранить в кеше, а не очищать их по крону.

Проблема в том, что стандартная система кеширования Друпала кеширует лишнюю ненужную информацию...

Аватар пользователя direqtor direqtor 4 июня 2010 в 4:59

На днях меня хостер постучал в мозжечок, что мол место всё на серваке выбрал. Стал разбираться - обнаружил на одном из сайтов таблицу cache_views размером 1,5GB. :%

Форм в самописном модуле у меня там много, но крон работал. Так что пока не понимаю причины. Может какой-то такой же эффект, а может моя криворукость в коде модуля. Пока разбор полётов отложил.

Аватар пользователя Sinkora Sinkora 4 июня 2010 в 15:14

"Valeratal" wrote:
эт разве много? :)

Дело не в количестве, а в самом факте того, что на ненужное кеширование данных расходуются лишние ресурсы.

А если бы мы кеш помещали в оперативку, то был бы явный некошерный перерасход...

Вообще в идеале, если, например, у нас стандартный статический сайт с 1000 страниц, то в кеше страниц должно быть не более 1000 записей. И если данные не меняются месяцами, то разумно, естественно, не очищать эти записи по крону, а обновлять лишь при изменении самих данных.

Это не только мое мнение насчет неэффективности работы стандарной системы кеширования для анонимов.

Как писал еще Демимурыч, можно своими силами создать свою собственную систему кеширования, которая будет в разы эффективнее стандартной друпаловской. И я с этим согласен.

Аватар пользователя Sinkora Sinkora 4 июня 2010 в 16:09

"Valeratal" wrote:
да, вот ведь незадача
никто не создает

Я создаю. И думаю, что многие другие разработчики тоже...