Как сделать простейший php прелоадер кеша для сайта?

Всем привет!

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

Суть задачи.
Есть интернет магазин 10 000 страниц.
Сайт довольно тяжелый, страницы генерируются от 2 до 8 секунд.
На сайте установлен модуль кеширования в статику, который кеширует страницу при первом открытии страницы, после этого страницы открывается зв 0.2 секунды.
Т.к. это интернет магазин, время жизни кеша 1 день, потом он обнуляется и поисковики + пользователи опять ждут открытия страницы.

Хочу написать php скрипт, который брал бы из базы список URL сайта и тупо открывал их по очереди запуская таким образом механизм создания кеша.
Основная проблема это время выполнения скрипта и нагрузка на сервер.
Если тупо запустить открытие 10к страниц в цикле, скрипт вырубится по таймауту создав при этом не кислую нагрузку на хостинг.

Нужно обходить страницы порциями, с небольшой задержкой между открытием каждой страницы.
Первое что приходит в голову, создать в таблице с URL поле date и запускать скрипт по выборке записей где date -1 день от текущей с лимитом например в 10 записей и всё в том же цикле.
Ну и при успешном открытии страницы апдейтить поле.
Запускать скрипт по крону каждую минуту с 2 до 6- утра.

Но мне кажется должно быть более изящное решение, а может и готовые скрипты для этих целей есть...
  • Вопрос задан
  • 1152 просмотра
Пригласить эксперта
Ответы на вопрос 7
402d
@402d
начинал с бейсика на УКНЦ в 1988
Сайт довольно тяжелый, страницы генерируются от 2 до 8 секунд
Нанять программиста, чтобы генерировались за 50 - 200 мс.

10000 стр * 7.2 сек / 3600 = 20 часов на обход сайта
Вы еще настаиваете на варианте обхода сайта ?
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
Переписывать - утопия.
Оставлять как есть - нельзя.
Не городите костыли. Возьмите лучше профайлер и узнайте из-за чего такие дикие тормоза. Потом оптимизируйте или закешируйте тяжелые запросы (скорее всего дело в них)
Ответ написан
Комментировать
catanfa
@catanfa
Можно выгрузить список URL в текстовый файл (если урлы меняются, то можно обновлять этот текстовый файл скриптом) и сконфигурировать siege для обхода этого списка раз в сутки. В итоге, задача решится буквально одной строчкой (похоже на то, что предлагает Виктор) но с опциями siege можно очень гибко управлять процессом, поиграться с количеством потоков, настроить таймауты, не нужно забивать место на диске, он сгенерит красивый отчёт, который можно проанализировать, и т.д.
Ответ написан
@spaceatmoon
Тут вам предлагают VPS. Имхо, ради 10к страниц бессмысленно. У меня есть проект на ~55к страниц и он открывается за 300мс. Наймите прогера и оптимизируйте слабые места.

Заказчик должен понимать, что его бизнес может пострадать.
Ответ написан
kumaxim
@kumaxim
Web-программист
Самый правильный вариант, на мой взгляд - заняться профилированием Вашего интернет-магазина. История, обычно, простая - делаем локальную копию к себе и запускаем профилирование. Смотрим что тянет, опимизируем.
В процессе, обычно, используется xdebug + blackfire + бубен

Если уж Вам хочется простое решение, тогда выгружайте список Ваших URL-ов куда-нибудь в отдельную таблицу или файл, после чего в 20-30 потоков запускайте Ваш скрипт по крону. Вопрос про 20-30 потоков решается так:
  1. Используйте два GET-параметра, скажем s & f
  2. Добавляйте в свой cron задания вида some-domain.com/cache-walker.php?s=100&f=300
  3. Сам скрипт, будет получать весь список URL для обхода, брать из них только 200 записей между 100 и 300 и открывать их, скажем, через curl

Заданий на cron Вы можете добавить столько, сколько Вам надо. Обычно, лимитов на их количество у провайдеров нет. Если вдруг, какой-то URL Вашего сайта будет открыт дважды, ничего страшного не произойдет. Про нагрузки на хостинг в этот момент сказать ничего не могу. Надо смотреть Ваши графики, спрашивать хостера. Количество потоков и/или количество записей для прохода за раз подбирайте эксперементальным путем.

Список самих URL-ов Вам в любом случае придется как-то маркировать, например, записывать timestamp последнего прохода. Задачи на CRON ставьте раз в минуту. Если timestamp менее 24 часов, просто игнорьте проход по такому URL. В самом скрипте можете прописать лимит на работу с 2 ночи до 6 утра.

Данное решение можно описать как "Божественный костыль имени Максим Кудрявцев ". На какое-то время это позволит Вам решить проблему. Далее нужно будет все равно либо заниматься профилированием либо переезжать на какую-то другую платформу. Когда именно никто не знает, даже автор доброй сотни божетсвенных костылей Максим Кудрявцев
Ответ написан
@Levhav
Возьмусь за разработку проектов любой сложности.
Не надо скрипта. Запустите wget с опцией на выкачивание всего рекурсивно. Одна баш команда и weget в много потоков пробежит по сайту найдёт ссылки и пробежит по ним.
pingvinus.ru/note/wget-download-sites
Ответ написан
Комментировать
gromel
@gromel
SEO | VDS | WP | BITRIX
Я использую этот скрипт:
https://github.com/khromov/sitemap-cache-warmer
И варианты запуска:
По крону, прямой запуск:
30 0 * * * php /home/warm-cache/warm.php url=https://mysite.ru/sitemap.xml sleep=0 key=******** > /dev/null 2>&1

Или через баш с нужной конфигурацией, последовательностью:
#!/bin/bash
TIME1=`date +%H:%M:%S`
echo "текст заголовка письма — начало в: "$TIME1"" | sudo mutt -s "текст письма, начало в: "$TIME1"" *****@****
sudo mysql -e "OPTIMIZE TABLE *******";
строка с командой на очистку кэша;
php /home/warm-cache/warm.php url=https://mysite.ru/sitemap.xml sleep=0 key=********
TIME2=`date +%H:%M:%S`
echo "текст заголовка письма — готово в: "$TIME2"" | sudo mutt -s "текст письма, готово в: "$TIME2"" *********@******

И запуск скрипта, так же по крону.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы