- Простая и эффективная система кеширования PHP
- Шаг первый. Создаем файл top-cache.php
- Шаг второй. Создаем файл bottom-cache.php
- Шаг три. Включаем файлы кеширования в код страницы
- 5 последних уроков рубрики «PHP»
- Фильтрация данных с помощью zend-filter
- Контекстное экранирование с помощью zend-escaper
- Подключение Zend модулей к Expressive
- Совет: отправка информации в Google Analytics через API
- Подборка PHP песочниц
- Кэширование контента в файлы PHP
- Код файла cache.php
- Использование
- Реализация кэширования на PHP
- Комментарии ( 18 ):
Простая и эффективная система кеширования PHP
Во время разработки проектов на PHP с нуля и без использования библиотек скорость может стать серьезным вопросом. Кеширование может существенно повлиять на скорость веб страниц. В данном уроке мы покажем простой и эффективный способ динамического кеширования страниц, которые нуждаются в ускорении.
Шаг первый. Создаем файл top-cache.php
Нам нужно создать два файла. Первый: создаем файл с именем top-cache.php и копируем в него следующий код:
\n"; include($cachefile); exit; > ob_start(); // Запуск буфера вывода ?>
Что происходит в данном коде? Первые 5 строк создают имя файла кеша в соответствии с текущем PHP файлом. Например, если мы используем файл с именем list.php , файл кеша будет иметь вид cached-list.html .
Строка 6 создает переменную $cachetime , которая определяет время жизни кеша.
Строки с 9 по 13 определяют условное выражение, которое служит для проверки наличия файла с именем, определенным в переменной $cachefile . Если файл существует, вставляется комментарий и файл, определенный в переменной $cachefile . Затем выражение exit прерывает выполнение скрипта и файл отправляется браузеру клиента. То есть, если найден статичный файл, то PHP код не будет выполняться сервером.
Строка 14 создает буфер, если файл, определенный переменной $cachefile не найден.
Шаг второй. Создаем файл bottom-cache.php
Теперь создаем второй файл PHP с именем bottom-cache.php и копируем в него следующий код:
Если файл с именем, определенным в переменной $cachefile отсутствует на сервере, выполняется данный код и создается файл. При следующем обращении к странице статичный $cachefile будет обслуживать браузер клиента вместо выполнения всего кода скрипта PHP.
Шаг три. Включаем файлы кеширования в код страницы
Теперь у нас есть два необходимых файла. Просто включаем их в страницу PHP, которую нужно кешировать. Файл top-cache.php нужно включить в начало страницы, а файл bottom-cache.php — в конце:
Теперь, если проверить кеширование на медленных страницах, то можно убедиться, насколько они стали быстрее загружаться.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.catswhocode.com/blog/how-to-create-a-simple-and-efficient-php-cache
Перевел: Сергей Фастунов
Урок создан: 2 Октября 2012
Просмотров: 61733
Правила перепечатки
5 последних уроков рубрики «PHP»
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Кэширование контента в файлы PHP
Для ускорения работы PHP-сайта можно применить механизм единоразового сохранения сформированного контента в файлах кэша для их повторного использования, например меню сайта, «тяжелый» вывод выгрузки из базы данных и т.д. Для этих целей был написан небольшой статический PHP-класс для кэширования блоков контента или страниц целиком основанный на буферизации вывода в переменную.
Код файла cache.php
else < self::$keys[] = $name; return false; >> else < return ''; >> /** * Отправка данных в кэш. */ public static function set($content) < if (self::$enable) < $name = array_pop(self::$keys); $dir = __DIR__ . self::$path . '/'; if (!is_dir($dir)) < @mkdir($dir, 0777, true); >file_put_contents($dir . '/' . $name . '.tmp', $content); > return $content; > /** * Начало кэширования фрагмента. */ public static function begin($name) < if ($content = self::get($name)) < echo $content; return false; >else < ob_start(); return true; >> /** * Завершение кэширования фрагмента. */ public static function end() < echo self::set(ob_get_clean()); >/** * Очистка кэша. */ public static function clear() < $dir = __DIR__ . self::$path; foreach (glob($dir . '/*') as $file) < if (is_file($file)) < unlink($file); >> > >
Использование
// Подключаем файл класса require_once ‘/cache.php’; // Кэшируем фрагмент кода if (Cache::begin(‘test’)) < ?>
Теперь, если в папке cache нет файла test.tmp, то условие выполнится, контент выведется и сохранится в файле. В другом случаи контент всегда будет выводится из файла кэша.
Реализация кэширования на PHP
Когда Вы делаете проект, который обладает достаточно проблемными страницами в плане скорости их загрузки, то надо проводить рефакторинг. Но бывают случаи, когда Вы всё написали идеально, однако, скорость оставляет желать лучшего. В таких случаях поможет кэширование страниц. Поэтому я решил написать статью о реализации кэширования на PHP.
Прежде чем показывать код, Вы должны заранее осознать алгоритм. Кэширование — это просто сохранение сгенерированной страницы в отдельный файл. То есть получили HTML-код страницы и сохранили его в отдельный файл. Затем при следующем обращении к скрипту заново страница не генерируется, а берётся HTML-код из этого файла. Разумеется, если при генерации речь может идти даже о десятках секунд (бывает и такое), то здесь речь идёт о сотых долях секунды. Разница очевидна.
Теперь сам код. Вам нужно создать 2 специальных файла. Первый файл будет заниматься выводом кэша, а второй — созданием кэша.
Начнём с первого файла, который назовём read_cache.php:
$cache_time = 300; // Время жизни кэша в секундах
$file = strrchr($_SERVER[«SCRIPT_NAME»], «/»);// Получаем название файла
$file = substr($file, 1); // Удаляем слеш
$cache_file = «/cache/$file.html»; // Файл будет находиться, например, в /cache/a.php.html
if (file_exists($cache_file)) // Если файл с кэшем существует
if ((time() — $cache_time) < filemtime($cache_file)) // Если его время жизни ещё не прошло
echo file_get_contents($cache_file); // Выводим содержимое файла
exit; // Завершаем скрипт, чтобы сэкономить время на дальнейшей обработке
>
>
ob_start(); // Открываем буфер для вывода, если кэша нет, или он устарел
?>
В данном скрипте мы получаем имя файла, затем проверяем существует ли такой кэш и не устарел ли он, а затем либо выводим его и заканчиваем работу, либо открываем буфер, куда будем помещать всю выходную информацию скрипта.
Теперь создадим файл write_cache.php, который будет заниматься записью в файл того, что у нас накопилось в буфере:
$handle = fopen($cache_file, ‘w’); // Открываем файл для записи и стираем его содержимое
fwrite($handle, ob_get_contents()); // Сохраняем всё содержимое буфера в файл
fclose($handle); // Закрываем файл
ob_end_flush(); // Выводим страницу в браузере
?>
И теперь в любом PHP-файле на сайте, отвечающем за вывод страницы, можно включить кэширование следующим образом:
require_once «read_cache.php»; // Пытаемся вывести содержимое кэша
// Здесь идёт обычная генерация страницы
require_once «write_cache.php»; // Здесь идёт сохранение сгенерированной страницы в кэш
?>
Таким образом, теперь Вы можете все свои проблемные страницы начать кэшировать. Но не забывайте, что пока кэш живёт, любые обновления пользователь видеть не будет. Поэтому делайте кэширование на PHP только для тех страниц, которые редко обновляются.
Создано 12.10.2012 09:20:49
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 18 ):
Я пробовал такое сделать но получилось криво. Когда пользователь входит на сайт то через секунд 30 появляються опять инпуты для входа, и пишется типа он вошёл «Здравствуйте, Admin». я так понимаю что такое нужно делать только для крупных проектов.
Да, это только если сервер не успевает всё быстро обрабатывать.
можно например кэшировать куски страниц, как это реализовано в yii. так же поможет apc или eAccelerator
Здравствуйте! А как сделать кэширование для страниц типа example.com/index.php?s=7
Аналогично, только названия файлов нужно будет разные делать, например, file-7.html.
Как быть с кэшированием, для вывода товаров в интернет магазине, если нужно проверять дополнительно на наличие товара в корзине.
Такие страницы либо вообще не кэшируются, либо кэшируются на несколько минут.
Ну кэшировать хоть даже на несколько минут страницу с $_Session вобще нет. Может есть какое-то решение? Например не проверять на наличие в корзине — это выход?
Единственное решение — не кэшировать данную страницу вообще.
Нет не страницу. Блок где выводятся товары со своими переменными, просто не проверять добавил ли посетитель товар или нет. Ведь такой блок всегда (почти всегда) имеет одни и те же значения
Блок кэшируется так же как и страница. В отдельный файл сохраняется, а потом просто подгружается контент из этого блока и выводится на страницу. В результате, блок не меняется.
Если эта операция создания блока выполняется заметно дольше, чем просто вывод из файла, то актуально.