PHP і Web. Кешування.
PHP і Web. Кешування.
Вступ.
Кешувати чи ні?
Можливість збереження в кеш сторінки визначається динамічністю інформації в джерелі даних. Таким чином необхідність використання кеша визначається Вами, виходячи з планованого часу життя сторінки.
Якщо мова йде про формування вибірки по базі (наприклад, пошук введеного користувачем слова), то таку сторінка обов'язково слід запитувати з сервера при кожному виклику без використання кеш, так як кількість варіантів запитуваних слів величезне, а якщо ми ще й маємо справу з мінливим масивом даних, то кешування безглуздо. Або мова йде про формування допустимо графіка приходять відвідувачів (який змінюється з кожним візитом, тобто практично з кожним викликом), то кешування вже просто шкідливо.
Однак, якщо ми говоримо про те ж графіку але за вчорашній день, то кешування рекомендується, так як дані змінюватися вже не будуть і ми можемо економити собі і користувачеві ресурси і час на завантаження таких сторінок приміщенням їх в локальний або загальний кеш. Як продовження цієї ситуації формування графіка не в реальному масштабі часу, а щогодини. Тут Ви можете заздалегідь передбачити дату закінчення "терміну придатності" сформованих даних.
Загальні принципи збереження сторінок в кеш.
PHP-програма може керувати кешуванням результатів її роботи формуючи додаткові поля в заголовку HTTP відповіді викликом функції Header ().
Кілька загальних тверджень характерних не тільки для PHP-програм:
- Сторінки передані по POST ніколи не зберігаються в кеш.
- Сторінки запитувані по GET і містять параметри (в URL присутній '?') Не зберігаються в кеш, якщо не вказано інше.
Таким чином в більшості ситуацій додаткових інструкцій в програму додавати не треба. Основні моменти на які слід звернути увагу можна звести до двох:
- заборона кешування документів, Кешована за замовчуванням
- кешування документів, що не підлягають кешуванню за замовчуванням.
Заборона кешування документів, Кешована за замовчуванням
Це завдання виникає для PHP-скриптів викликаються без параметрів або є індексами директорій, однак формують дані персонально під користувача (наприклад на основі cookies або user agent) або працюють на основі швидко змінюються даних. За специфікації HTTP / 1.1 ми можемо управляти наступними полями:
Кешування документів, що не підлягають кешуванню за замовчуванням
Зворотній завдання, може здатися на перший погляд абсурдною. Однак і в цьому існує потреба. Крім простий мінімізації трафіку при розробці web-програми слід враховувати комфортність роботи з нею користувача. Наприклад, деякі сторінки Вашого сервера формуються на основі статичних даних великого обсягу. Можливість включення їх в кеш істотно поліпшить швидкість роботи сервера для користувача і частково звільнить Ваш від численних повторних генерацій такої сторінки. Тема дозволяє збереження на проксі-серверах:
-
header ( "Cache-control: public");
Кешування до закінчення коректності
Описані вище рішення досить прямолінійні, хоча і підходять для більшості завдань. Але протокол HTTP / 1.1 має кошти для більш тонкого управління кеш сторінок, і існують завдання вимагають застосування цих механізмів. Як приклад - web-додатки працюють з даними великого обсягу і прогнозованою динамічністю. Коректність даних може встановлюватися як за датою прогнозованого оновлення, так і по зміні змісту. Для цих випадків використовуються різні заголовки управління кеш.
Кешування з прогнозованим оновленням
Кешування за змістом
а значить за правилами сторінка не буде зберігатися в кеш (присутні параметри), але через заголовок можна управляти цим.-
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 =" для вирішення кешування сторінок в браузері. Хоча це теоретичне припущення, чи не перевірене на практиці.