Php і кешування

вступ

Для оптимізації роботи з мережею використовується механізм збереження одного разу отриманих по 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 =» для дозволу кешування сторінок в браузері. Хоча це теоретичне припущення, чи не перевірене на практиці.