вступ
Для оптимізації роботи з мережею використовується механізм збереження одного разу отриманих по HTTP документів в кеші з метою їх повторного використання без звернення до сервера-джерела. Документ, який було збережено в кеші буде доступний при наступному зверненні до нього, без вивантаження з сервера-джерела, що покликане підвищити швидкість доступу клієнта до нього і зменшити витрату трафіку мережі.
Кешувати чи ні?
Можливість збереження в кеш сторінки визначається динамічністю інформації в джерелі даних. Таким чином необхідність використання кеша визначається Вами, виходячи з планованого часу життя сторінки.
Якщо мова йде про формування вибірки по базі (наприклад, пошук введеного користувачем слова), то таку сторінка обов'язково слід запитувати з сервера при кожному виклику без використання кеш, так як кількість варіантів запитуваних слів величезне, а якщо ми ще й маємо справу з мінливим масивом даних, то кешування безглуздо. Або мова йде про формування допустимо графіка приходять відвідувачів (який змінюється з кожним візитом, тобто практично з кожним викликом), то кешування вже просто шкідливо.
Рекомендуємо прочитати Андрій Ліпатцев: Ряд кроків щодо поліпшення якості сайту
Однак, якщо ми говоримо про те ж графіку але за вчорашній день, то кешування рекомендується, так як дані змінюватися вже не будуть і ми можемо економити собі і користувачеві ресурси і час на завантаження таких сторінок приміщенням їх в локальний або загальний кеш. Як продовження цієї ситуації формування графіка не в реальному масштабі часу, а щогодини. Тут Ви можете заздалегідь передбачити дату закінчення «строку придатності» сформованих даних.
Загальні принципи збереження сторінок в кеш
PHP-програма може керувати кешуванням результатів її роботи формуючи додаткові поля в заголовку HTTP відповіді викликом функції Header ().
Кілька загальних тверджень характерних не тільки для PHP-програм:
- Сторінки передані по POST ніколи не зберігаються в кеш.
- Сторінки запитувані по GET і містять параметри (в URL присутній '?') Не зберігаються в кеш, якщо не вказано інше.
Таким чином в більшості ситуацій додаткових інструкцій в програму додавати не треба. Основні моменти на які слід звернути увагу можна звести до двох:
- заборона кешування документів, Кешована за замовчуванням
- кешування документів, що не підлягають кешуванню за замовчуванням.
Заборона кешування документів, Кешована за замовчуванням
Це завдання виникає для PHP-скриптів викликаються без параметрів або є індексами директорій, однак формують дані персонально під користувача (наприклад на основі cookies або user agent) або працюють на основі швидко змінюються даних. За специфікації HTTP / 1.1 ми можемо управляти наступними полями:
Expires
Задає дату закінчення терміну придатності документа. Завдання її в минулому визначає заборону кеш для даної сторінки.
Cache-control: no-cache
Управління кеш. Значення no-cache визначає заборону кеш даної сторінки. Для версії протоколу HTTP / 1.0 діє «Pragma: no-cache».
Last-Modified
Дата послднего зміни вмісту. Поле актуально тільки для статичних сторінок. Apache замінює це поле значенням поля Date для динамічно генеруються сторінок, в тому числі для сторінок містять SSI.
На сайті www.php.net дається наступний код для заборони кешування.
Однак, даний заголовок надмірний. У більшості випадків достатньо:
header ( "Expires: Thu, 01 Jan 1970 00:00:01 GMT");
Щоб позначити документ як «вже застарілий» слід встановити Expires рівним полю Date.
header ( "Expires:". gmdate ( "D, d M Y H: i: s"). "GMT");
Ну і не слід забувати, що форми, запитані по POST також не підлягають кешуванню.
Рекомендуємо прочитати «Кластеризація» - новий інструмент Serpstat
Кешування документів, що не підлягають кешуванню за замовчуванням
Зворотній завдання, може здатися на перший погляд абсурдною. Однак і в цьому існує потреба. Крім простий мінімізації трафіку при розробці web-програми слід враховувати комфортність роботи з нею користувача. Наприклад, деякі сторінки Вашого сервера формуються на основі статичних даних великого обсягу. Можливість включення їх в кеш істотно поліпшить швидкість роботи сервера для користувача і частково звільнить Ваш від численних повторних генерацій такої сторінки. Тема дозволяє збереження на проксі-серверах:
Кешування до закінчення коректності
Описані вище рішення досить прямолінійні, хоча і підходять для більшості завдань. Але протокол HTTP / 1.1 має кошти для більш тонкого управління кеш сторінок, і існують завдання вимагають застосування цих механізмів. Як приклад - веб-додатки, що працюють з даними великого обсягу і прогнозованою динамічністю. Коректність даних може встановлюватися як за датою прогнозованого оновлення, так і по зміні змісту. Для цих випадків використовуються різні заголовки управління кешем.
Кешування з прогнозованим оновленням
$ Dt_tmp = getdate (date ( "U"));
header ( "Expires:". gmdate ( "D, d M Y H: i: s", date ( "U") - (86400 * ($ dt_tmp [ "wday"] - 8))). "GMT");
header ( "Cache-control: public");
Інший підхід, який застосовується при більш оперативному оновленні інформації і одночасної високої відвідуваності сервера (інакше кешування не буде ефективним) полягає у використанні заголовка Cache-control: max-age = секунди, що визначає час після закінчення якого документ вважається застарілим і має більший пріоритет при обчисленні « свіжості »документа.
Рекомендуємо прочитати Найактуальніше в пошуковому маркетингу
Якщо Ви публікуєте новини з інтервалом в 30 хвилин:
header ( "Cache-control: public");
header ( "Cache-control: max-age = 1800");
Кешування за змістом
Розглянемо приклад видачі зображення з бази даних індентіфіціруемих по ID. Виклик сторінки виглядає наступним чином:
а значить за правилами сторінка не буде зберігатися в кеші (присутні параметри), але через заголовок можна управляти цим.
mysql_connect ( "host", "user", "passwd");
$ Image = mysql ( "db", "select pics, type from pictures where id = $ id");
Header ( "Cache-Control: public, must-revalidate");
Header ( "Vary: Content-ID");
Header ( "Content-ID:" .md5 (mysql_result ($ image, 0, "pics")));
Header ( "Content-type:" .mysql_result ($ image, 0, "type"));
echo mysql_result ($ image, 0, "pics");
mysql_freeResult ($ image);
mysql_close ();
Примітки для Russian Apache
І приємне (або неприємне) повідомлення для користувачів Russian Apache. Так як сервер видає старовину по користувальницької кодуванні він автоматично забезпечує всі сторінки (не тільки динамічні) заголовками заборони кешування.
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Так що все сторінки не кешувального. Формування в скрипті заголовка Expires ефекту не має. Навіщо це зроблено і деякі методи боротьби описані на apache.lexa.ru і немає необхідності відтворювати ці поради тут. Розглядаючи роботу PHP + Russian Apache ось як можна вплинути на кешувального.
Для скриптів виводять зображення ситуація проста - Russian Apache НЕ перекодує (а значить не устанавліваетсрок закінчення придатності) документи мають MIME тип image / *. Для використання кеш текстових документів мабуть слід використовувати «Cache-control: private, max-age =» для дозволу кешування сторінок в браузері. Хоча це теоретичне припущення, чи не перевірене на практиці.