Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Кэширование динамической страницы
 
 автор: saz   (08.12.2008 в 12:08)   письмо автору
 
 

Подскажите, пожлуйста как решить проблемку. Проблема в следующем. Отлаживаю php-скрипт в UniServer - работает нормально. Кладу этот скрипт на рабочий сервер. User заходит на динамически созданную страницу, вводит в полях чего-то, нажимает кнопку, появляется другая динамическая страница, и вот как только user жмет кнопку "Назад" выводится сообщение "Внимание страница устарела..." и т. д. User нажимет "Обновить" страница обновляется без того, что он ввел ранее т. е. с пустыми текстовыми полями.
User работает не через проксю, а на прямую с сервером. Где какие настройки поменять, подскажите плиз.

  Ответить  
 
 автор: xx77   (09.12.2008 в 02:12)   письмо автору
 
   для: saz   (08.12.2008 в 12:08)
 

Под нормальной работой скрипта что имется ввиду ?

Сервер может только добавить заголовков в выдачу страницы
, посмотреть можно например таким скриптом
<pre><?php
// инициализация сеанса
$ch curl_init();

// установка URL и других необходимых параметров
curl_setopt($chCURLOPT_URL"http://АдресСтраницы/");
curl_setopt($chCURLOPT_HEADER1); // показать заголовки
curl_setopt($chCURLOPT_NOBODY1); // без содержимого

// загрузка страницы и выдача её браузеру
curl_exec($ch);
// завершение сеанса и освобождение ресурсов
curl_close($ch);
?>

А так, тот процесс, который описан, сильно зависит от используемого браузера, и ещё от <META>-тегов этого html и/или от вызовов функций типа header() в коде скрипта

  Ответить  
 
 автор: saz   (11.12.2008 в 11:07)   письмо автору
 
   для: xx77   (09.12.2008 в 02:12)
 

Скрипт у меня не запустился. Функции типа header() я не использую. META я использую так <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> больше тэг META нигде не встречается
Рабочий сервер использует php 4.4.8, апач 2.2.8, MySQL 4.1.16
Я у себя на машине использую Uniserver 2.6
Используются браузеры IE 5.0-6.0

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

Под ненормальной работой скрипта я подразумеваю следующее:
...User нажимает кнопку назад и появляется сообщение "Внимание страница устарела...", User нажимает кнопку "Обновить" и появляется форма с пустыми текстовыми полями.

Вопрос: где и что нужно изменить чтобы скрипт работал нормально.

Подскажите пожалуйста, буду благодарен.

  Ответить  
 
 автор: xx77   (12.12.2008 в 04:46)   письмо автору
 
   для: saz   (11.12.2008 в 11:07)
 

Возможно даже это просто такая особенность вашего браузера , типа в локальной сети одно, а так другое.
Но я пока не замечал такого.
На Apache обычно приделывают только стандартные заголовки сервера ,типа версии и всё такое, иногда более полные иногда покороче , хотя ещё может присутствовать mod_expires
, тогда бывают например ещё такие диррективы для .htaccess
( выдернул где-то из статьи "Маленькие настройки большого веб-сервера")

# включить установку http-заголовков expires
ExpiresActive on
# по умолчанию для всех элементов устанавливается дата на 1 день позднее времени запроса
# ExpiresDefault «access plus 1 days»
# альтернативная запись, разница во времени указывается в секундах (86400 секунд равны одному дню)
# ExpiresDefault A86400
# можно отсчитывать время от момента последнего изменения запрашиваемого объекта
# ExpiresDefault «modification plus 1 weeks»
# ExpiresDefault M604800
# можно задавать время отдельно для различных типов объектов
# для html-страниц
ExpiresByType text/html «access plus 10 minutes»
# для текстовых файлов
ExpiresByType text/plain «access plus 10 minutes»
# для изображений
ExpiresByType image/gif «modification plus 1 days»
ExpiresByType image/jpeg «modification plus 1 days»

, и посмотреть заголовки скриптом не помешало-бы


Попробуйте отправлять заголовки из скрипта, функцией header().
примерно написать в начале скрипта (до любого вывода в браузер) что-то такое
<?
header
('Expires: '.gmdate("D, d M Y H:i:s"time()+60*10).' GMT');
 
// страница остается неизменной 10 минут

http://xpoint.ru/know-how/Articles/SlezhenieZaKontentom?53здесь можно посмотреть пример посложнее


Конкретно на кеширование влияют :
Expires: // Устанавливает дату и время
//, после которой информация в документе будет считаться устаревшей.

Pragma: //
Cache-Control: // Здесь читал это RFC и не очень понял , поскольку на английском :)
// только понял что есть возможность устанавливать то-же expires,
давать рекомендации браузерам , использовать кэш в онлайне или нет, и что-то подробнее о том как использовать.
и что-то с обращениями проверки обновлённости страниц

  Ответить  
 
 автор: saz   (15.12.2008 в 11:35)   письмо автору
 
   для: xx77   (12.12.2008 в 04:46)
 

Пытался использовать строку <META HTTP-EQUIV="Expires" CONTENT="Tue, 02 Jan 2050 01:00:00 GMT"> Чтобы страница считалась всегда новой - не помогает. Предложенные Вами настройки файлов .htacces или http.conf на Uniservere закоментированы (и при этом возврат "Назад" работает нормально), так что дело не в этом. Да еще и администратор рабочего сервера мягко говоря, не очень хочет менять настройки. Я программист и рабочий сервер не мой. Вот и получается проги у меня на локальном сервере работают нормально, а на рабочем не нормально.

Предложенный метод по ссылке http://xpoint.ru/know-how/Articles/SlezhenieZaKontentom?53 мне не очень понравился, так как все это можно сделать проще. Можно записывать каждую динамическую страницу на диск сервера как файл, при этом имя этого файла будет дополняться id пользователя, то есть самостоятельно в тупую кэшировать свои страницы. Но и это не вариант (хотя возможно так и придется делать). Программ у меня не одна и не две и все работают на локальном сервере и они относительно большие. Не хочется вносить такие радикальные изменения в код программ. Хотелось бы какую-нибудь настройку апача изменить и чтобы все работало :)

Закоментировал вот эти настройки в Юнисервере httpd.conf:

LoadModule expires_module modules/mod_expires.so
LoadModule file_cache_module modules/mod_file_cache.so

Так все равно переход "Назад" работает нормально. Пытаюсь сломать Uniserver, чтобы выяснить какую настройку нужно изменить. Не получается :)

Проблему в принцепе решает применение метода GET. То есть
<form action=1.php method GET>, Но тут возникают другие проблемы, по хлеще предыдущих. Например у меня не хотела субмитится форма, т. е. не работали кнопки.

Для тех у кого схожая проблема, и они не знают как ее решить, но согласны на изменение кода скриптов могу предложить два способа:
1) В тупую принудительно кэшировать страницы, то есть когда выводите страницу пишете:
$cache="<html><body>...</body></html>"
Потом saveCache($cache,$id)
Затем при нажатии ссылки
<a href=script.php?act=link&id=$id>Предыдущая</a>
В файле скрипта делаете проверку if($act=="link"){loadCache($cache,$id);} и загружаете страницу. Реализацию saveCache и loadCache описывать не буду это и так понятно, просто запись текста на диск и чтение с диска.

2) Сделать меню, где перечислить все динамические страницы в виде ссылок или кнопок и в скрипте обрабатывать нажатие ссылок (кнопок) передавая параметры в функции вывода этих страниц. Например:
<br><a href=script.php?act=mainPage&id=$id&p1=$p1&p2=$p2...>Главная страница</a>
<br><a href=script.php?act=guestBook&id=$id&p1=$p1&p2=$p2...>Гостевая книга</a>
<br><a href=script.php?act=guestPage&id=$id&p1=$p1&p2=$p2...>Страница гостя</a>
...
if($act=="mainPage"){mainPage($id,$p1,$p2...);}
if($act=="guestBook"){guestBook($id,$p1,$p2...);}
if($act=="guestPage"){guestPage($id,$p1,$p2...);}

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования