K2 + cache и большое количество статей — ошибка сохранения/изменения материалов

K2 + cache и большое количество статей — ошибка сохранения/изменения материалов изображение поста

А это значит что к2 + joomla + даже стандартный cache дают очень хороший результат. Жалоб на нагрузку даже на обыкновенном хостинге от хостеров не поступало. Сайты грузятся быстро и чувствуют себя хорошо.

Проблема при обновлении содержимого на Joomla + k2, когда включен cache, а статей – тысячи

Все бы хорошо, но есть одно но. И очень существенное: возникают огромные проблемы с обновлением этих сайтов вручную. При сохранении/изменении новых материалов в панели администрирования joomla k2, либо же со страниц сайта возникают ошибки, например: здесь и ошибка 500 (apache + nginx), и ошибка о превышении времени выполнения скрипта — max execution time exceeded, или ошибка с превышением памяти — memory_limit, Fatal Error: Allowed memory size, а возможно даже просто белая страница, когда превышен лимит процессорного времени. Такое может происходить даже тогда, когда у Вас собственный vps или vds.

В чем же причина? Дело в том, что k2 создает для своих страниц много кэширующих файлов по следующим путям при включении кэша joomla: /cache/com_k2/, /cache/com_k2_extended/. И чем больше новостей, тем больше таких файлов создается в папках (по одному на новость, еще по одному для комментариев, для плагинов, для категорий, списков по тегам, по автору и т.п.). В эти файлы помещаются результаты запросов к базе данных. Причем последние версии k2 с включенным кэшем не производит ни одного запроса к базе данных после кэширования результатов!

Разработчики, помыслив логически, решили, что при сохранении новых статей, или их редактировании, добавлении новых тегов, или работе с категориями в k2 было бы неплохо сбросить ВЕСЬ кэш компонента k2 + его модулей. Решение, конечно, правильное. Но теперь представьте, у Вас на сайте 3-4 и более тысяч статей, Вы сохраняете новую, и указываете cms joomla, что ей следует очистить кэш компонента k2, который к данному моменту насчитывает как минимум 20 тысяч файлов. Сервер скрипит, рычит, и не справляется с нагрузкой, так как мы указываем ему удалить 20 тысяч файлов. В итоге вместо актуализации содержимого разработчики k2 подложили нам огромную свинью в невозможности обновлять содержимое при большом количестве файлов в кэше.

Мысли по решению проблемы были разные. Первая: уменьшить время кэширования, чтобы файлов в кэше было не так много. Но это не помогло. Joomla не чистит за собой кэш (теперь понятно, почему). Вторая: чистить время от времени содержимое папки по крону или вручную: но это создавало бешеную нагрузку на сервер и отнимало огромное количество памяти (даже при ручной очистке при помощи запуска через exec rm –fr и создавало невероятную нагрузку на файловую подсистему: load avrange 14 – 15, при нормальной работе сервера с load avrange: 0.4 – 0.5).

Причем эта проблема с кэшем наблюдается у всех версий k2, и 2, и 2.1 – 2.2, и 2.4, и 2.5 и 2.6 c Joomla 1.5 – 2.5.

Итак, решение было найдено: отключить очистку кэша, закомментировав ее в коде к2. При этом сохранив сам кэш включенным и нормально работающим.

У решения только одна слабая сторона: актуализация содержимого (то есть при добавлении/обновлении содержимого изменения появится на сайте тогда и только тогда, когда истечет время системного кэша). Но, с другой стороны, чтобы просмотреть, как выглядит содержимое на сайте после добавления/редактирования достаточно только лишь зайти под своим логином и паролем на сайт с лицевой его части (ведь к2 не кэширует содержимое, а отдает актуальную версию из базы данных, которые вошли, используя свой логин и пароль).

К2 + кэш на сайтах с тысячами статей решение проблемы обновления содержимого

Итак, нужно найти следующие строки кода:

$cache = JFactory::getCache('com_k2');
$cache->clean();

И закомментировать их:

//$cache = JFactory::getCache('com_k2');
//$cache->clean();

Таких вхождений будет очень много. Они будут встречаться в следующих папках: /components/com_k2, /administrator/components/com_k2/

Для версии k2 2.6.2 joomla 1.5 – 2.5:

Файлы:

/administrator/components/com_k2/models/categories.php

Строки: 221 – 222, 240 – 241, 278 – 279, 294 – 295, 311 – 312, 334 – 335, 357 – 358, 380 – 381, 406 – 407, 456 – 457, 512 – 513, 639 – 640.

/administrator/components/com_k2/models/category.php

Строки: 136 – 137.

/administrator/components/com_k2/models/comments.php

Строки: 123 – 124, 150 – 151, 177 – 178, 210 – 211, 232 – 233,

/administrator/components/com_k2/models/extrafield.php

Строки: 161 – 162,

/administrator/components/com_k2/models/extrafields.php

Строки: 133 – 134, 149 – 150, 187 – 188, 203 – 204, 220 – 221, 238 – 239, 334 – 335, 355 – 356.

/administrator/components/com_k2/models/item.php

Строки: 867 – 868.

/administrator/components/com_k2/models/items.php

Строки: 253 – 254, 272 – 273, 310 – 311, 326 – 327, 343 – 344, 382 – 383, 398 – 399, 415 – 416, 438 – 439, 461 – 462, 645 – 646, 664 – 665, 695 – 696, 804 – 805, 1300 – 1301,

/administrator/components/com_k2/models/tag.php

Строки: 50 – 51, 112 – 113.

/administrator/components/com_k2/models/tags.php

Строки: 102 – 103, 118 – 119, 135 – 136,

/administrator/components/com_k2/models/user.php

Строки: 115 – 116,

/administrator/components/com_k2/models/usergroup.php

Строки: 48 – 49,

/administrator/components/com_k2/models/usergroups.php

Строки: 73 – 74,

/administrator/components/com_k2/models/users.php

Строки: 213 – 214,

/com_k2/plugins/josetta_ext/k2category/k2category.php

Строки: 281 – 282,

/com_k2/plugins/josetta_ext/k2item/models/item.php

Строки: 302 – 303.

И в заключении статьи Вы можете скачать уже измененную версию k2 2.6.2 с закомментированным вхождением вызова функций очистки кэша. А в ближайшее время будет составлен bug report разработчикам, ибо кэш лучше конечно же чистить или для того элемента, в котором наблюдается изменения (группы элементов), или же дать возможность запретить очистку кэша для высоконагруженных сайтов из панели администрирования в настройках k2 с включенным кэшем joomla.

Комментарии

  • аватар пользователя Василий
    Василий (19.07.2021 17:12)

    redis memchached почему не попробовали?