Кэширование страниц

12
nomarketing
На сайте с 23.09.2009
Offline
149
1643

Всем привет,

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


<?php
// мониторим скорость выполнения
$start = microtime(true);
// задаем время жизни кэша в секундах
$cacheTime = 60;
// Название скрипта
$fileName = strrchr($_SERVER["SCRIPT_NAME"], "/");
// удаляем все слеши
$fileName = trim($fileName, '/\\');
// путь для хранения кеша
$cacheFile = "cache/$fileName.cache";
// если кэш существует
if (file_exists($cacheFile)) {
// проверяем актуальность кеша
if ((time() - $cacheTime) < filemtime($cacheFile)) {
// показываем данные из кеша
echo file_get_contents($cacheFile);
// мониторим скорость работы
echo 'Время выполнения скрипта: '.(microtime(true) - $start).' сек.';
exit; // Завершаем скрипт
}
}
// открываем буфер
ob_start();
?>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test cache</title>
<meta http-equiv="content-type"content="text/html; charset=utf-8" />
</head>
<body>
<?php
// для теста
$arrayTest = array();
for ($i=0; $i < 10000; $i++){
$arrayTest[$i] = $i;
}
foreach($arrayTest as $i){
echo $i;
}
?>
</body>
</html>

<?php
// Открываем файл для записи
$file = fopen($cacheFile, 'w');
// сохраняем все что есть в буфере вфайл кеша
fwrite($file, ob_get_contents());
// закрываем файл
fclose($file);
// выводим страницу
ob_end_flush();
// мониторим скорость работы
echo 'Время выполнения скрипта: '.(microtime(true) - $start).' сек.';
?>

Из кода понятно, что время кэша, 60 секунд, и генерируемая статическая страница, создается в папке /cache, сдесь вроде все ясно.

На счет сайта.

Сайт достаточно крупных, есть ряд городов, и категорий.

Код я проверил только на главной странице сайта, результат достаточно утешителен.

Сайт работает по принципу, нажимаеш на город, выдается маин пейдж с категориями этого города, кто знает сайты обьявлений работают по тому же принципу.

Так вот, я кэш сделал именно для всех маин пейджов, городов, так как там ничего не меняется, т.е в своем городе свои категории и точка, подкатегории не кэшировал, так как там уже выдается контент.

Хотел бы у вас спросить советов, может я что то не учел ? может код не безопасен, или не верен с точки зрение оптимизации ?

Еще хотел бы спросить, если я захочу убрать кэш, мне будет достаточно убрать код, и удалить папку кэш ?, к примеру если я сделаю глобальное обновление сайта ? - допустим сменю логотип и пару категорий ?

nomarketing
На сайте с 23.09.2009
Offline
149
#1

Есть кто живой, или одни дорвейщики сидят ? 😂

siv1987
На сайте с 02.04.2009
Offline
427
#2

Сам по себе код безопасен, одно не понятно, нахрена надо было делать циклом фор заполнить массив, чтобы потом foreach'ем пройтись и вывести значения этого массива?

или for

или http://www.php.net/manual/ru/function.array-fill.php

C
На сайте с 20.09.2007
Offline
114
#3
// удаляем все слеши

Можно тупо md5(адрес страницы)...

// путь для хранения кеша

...а потом брать, например, три-четыре первых символа - это будет подпапка в папке cache.

$file = fopen($cacheFile, 'w');

Желательно после добавить:

flock ($cacheFile,2);

я кэш сделал именно для всех маин пейджов, городов, так как там ничего не меняется

Тогда зачем для редко изменяемых страниц всего 60 секунд?

допустим сменю логотип

У вас изображения-js-css используемые в оформлении тоже кэшируются? Зачем?

ИМХО, самые лучшие VDS: https://cp.inferno.name/aff.php?aff=4048
speed-core
На сайте с 30.03.2014
Offline
33
#4

код безопасен, чтобы обновить кеши - удалите все с папки "cache"

оптимизации тут так таковой не сделаешь, по край не мере смысла нету.

все что идет после " ob_start(); " и до "$file = fopen($cacheFile, 'w'); "

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

HOST-PROTECTION (/ru/forum/848747), профессиональный web хостинг, гарантия стабильности, защита от DDoS.
Joker-jar
На сайте с 26.08.2010
Offline
154
#5

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

L
На сайте с 07.12.2007
Offline
351
#6
nomarketing:
сталкиваюсь с кэшоем, так как проэ ект попался, достаточно большой.. водт ниже ... вам тоже щассейчас расскажу.

создается в папке /cache, сздесь вроде все ясно.

На счет сайта.

Сайт работает по принципу, нажимаешь на город, ... кто знает сайты обь ъявлений работают по тому же принципу.

сделал именно для всех маин пейджов ей, ...

Сколько же Вам лет и зачем вы взялись за достаточно большой проЭкт, не понимая что, зачем, и как кэшировать.

Кэширование на стороне сервера надо делать как сказал Joker-jar - тяжёлые участки.

Кэширование на стороне клиента - надо обрабатывать заголовки IfModifidSinse и правильно отдавать LastModified.

Для 99% сайтов достаточно грамотно написать mysql-запросы и использовать индексы.

Со "статикой" (css, картинки, ява-скрипты) отлично разберётся nginx.

PS: И не надо тупо вставлять в свои сайты куски кодов, "найденные на просторах рунета".

nomarketing
На сайте с 23.09.2009
Offline
149
#7
censored!:
Можно тупо md5(адрес страницы)...


...а потом брать, например, три-четыре первых символа - это будет подпапка в папке cache.


Желательно после добавить:
flock ($cacheFile,2);


Тогда зачем для редко изменяемых страниц всего 60 секунд?


У вас изображения-js-css используемые в оформлении тоже кэшируются? Зачем?

Я сделал так, в к названию страницы кеэша, просто прикрепил название города, а городов одинаковых как бы нет, в итоге у меня в кеше получается что то типа такого

index.cityname

Время поставил на месяц ? - или стоит ставить на больше ?

Еще хочу активировать gzip компрессию -

методы.. которы описали выше (на счет mysql) и т д тоже пока что рассматриваю, буду пробовать оптимизировать (дело в том что я больше по СЕО) :)

Вообщем код - безопасен и его можно использовать поставив больше времени только на кэшерование (только городов) и все.

nomarketing
На сайте с 23.09.2009
Offline
149
#8

Еще вопрос,

Что делать с 90к постами ? они в принципе статические, то можно их кешировать или нет ? каждый день примерно по 50 постов добовляется.. - просто интересно на счет места на диске - ну или не будет ли это все дело нагружать хардиск - систему как то - ?

Просто оптимизация бд - это одно, но если статических постов много то почему бы их не кэшировать ? но как то нужно придумать что кэшировать а что нет.. и сделать это правильно, я думаю тем куском скрипта что выше пропробовать кэшировать посты, но вот как отразится это на самом пк пока не знаю -

Что посоветуете ?

siv1987
На сайте с 02.04.2009
Offline
427
#9

"Кешировать" - понятие относительное. У вас что, посты динамические и они парсятся каждый вызове например от ббкодов? Тогда наверное есть смысл кешировать. Или речь о кеширование постов из бд на диске? Тогда вопрос - зачем? Место много? Каким образом вы собираетесь это реализовать? Какое преимущество оценили? Нет - тогда не занимайтесь ерундой.

nomarketing
На сайте с 23.09.2009
Offline
149
#10
siv1987:
"Кешировать" - понятие относительное. У вас что, посты динамические и они парсятся каждый вызове например от ббкодов? Тогда наверное есть смысл кешировать. Или речь о кеширование постов из бд на диске? Тогда вопрос - зачем? Место много? Каким образом вы собираетесь это реализовать? Какое преимущество оценили? Нет - тогда не занимайтесь ерундой.

1- около 80% не динамического контента выводится юзерам (это и есть те самые посты)

Получается их отображение связанно с БД - так как они оттуда генерируются.

Естесвенно я задал себе вопрос, а что если их кэшировать ? они все равно в 90% не изменяются. т.е лежат как устаревшие но тянут трафик. (то зачем их каждый раз дергать ?) Или я не прав ? В постах нет ни каких бб кодов, работа сайта такова, (это сайт обьявлений ну почти)

1 - Юзер заходит на сайт

2 - Юзер публикует статью

3 - Юзер может иногда менять параметры статьи (это редко происходит, поправка там еще что)

4 - Вообщем то и все.

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

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий