2012-04-25 5 views
0

У меня есть динамический веб-сайт со страницами, нарисованными с использованием PHP.

Использование переменной $ _GET Я получаю команды от пользователя, выполняя PHP на основе команды $ _GET и рисуя страницу.

Однако, когда пользователь нажимает кнопку «Назад», я хочу, чтобы они увидели страницу, которая была динамически отрисована для них раньше, вместо повторного выполнения кода.

Я видел это, но не могу понять, как это сделать.

Например предположим следующий код:

if ($_GET['cmd'] == "time") { 
    echo "The current Unix timestamp is: " . time; 
} 

Кликнув на: somepage.php CMD = время выполняет код правильно, но при использовании кнопки назад, повторно запускает код. Есть ли способ использовать кеш или что-то еще, о чем я не знаю, что позволит пользователю видеть время, какое было, когда страница была нарисована, вместо повторного выполнения?

================================================================================================================================== ========================================== Чтобы попытаться быть немного более конкретно, страницы и код, о которых я говорю, выполняют несколько функций и изменяют данные MySQL на основе приведенных команд, затем рисуют страницу.

Я хочу знать, есть ли способ использовать кнопку «Назад», чтобы не повторять выполнение, а просто показать страницу, которая была динамически отображена в первый раз.

ответ

0

Я не уверен, что это то, что вы ищете, но это может быть полезно. Вместо использования php get вы можете использовать ajax, а затем реализовать это: http://www.nerdswithlives.com/2010/03/yui-ajax-browser-history-back-button.html

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

EDIT

думать больше о вашей проблеме, я считаю, что ответ лежит с помощью PHP сессий и хранения данных на компьютере клиента. Когда пользователь нажимает «назад», он/она отправляется на кешированную страницу ... так что кэширование - это не ваш ответ. Вам нужно, чтобы он перерисовывался определенным образом, но поскольку вы используете GET, браузер НЕ кэширует это ... по крайней мере, с функциональностью кнопки «назад» в любом случае. Ваш ответ состоит в том, чтобы начать сеанс на каждой странице, где существует этот динамический контент, сохранить переменную типа $_SESSION['sessionVar'] = 1; или что угодно. Затем динамически измените переменную в зависимости от того, что было нарисовано на этой странице. Затем, когда пользователь нажимает «назад», вы можете проверить, что это за переменная, и получить данные снова. Выйдите из соображений использования кеша для этого - вам нужно выполнить RE-DRAW любые данные, которые пользователь видел ранее. Сессии были бы полезны в этом случае.

+0

Это не совсем то, что я ищу, но спасибо за быстрый ответ. – Nate

+0

Нет проблем. Возможно, показывая больше вашего кода (пример динамического контента, который рисуется ...) может помочь нам понять, что вы пытаетесь сделать. – mdance

0

вы могли бы взглянуть на использование $_SESSION

if ($_GET['cmd'] == "time") { 
    $_SESSION['time'] = isset($_SESSION['time']) ? $_SESSION['time'] : time; 
    echo "The current Unix timestamp is: " . $_SESSION['time']; 
} 
+0

Этот код был всего лишь примером того, что я имел в виду, однако фактический код из нескольких разных файлов выполняет несколько действий, включая взаимодействие с базами данных MySQL для вывода вывода. Я просто хочу показать страницу в том состоянии, что она была нарисована в это время, если это возможно. – Nate

+0

может взглянуть на APC, или memcache – Ascherer

0

Вы должны использовать заголовки кэширования HTTP.Есть три стратегии:

  • EXPIRE раз
  • ETags
  • Последнее изменение раз

Первый устанавливает дату/время для страницы истекает. Это может быть достигнуто посылки заголовка:

header('Expires: Thu, 28 Apr 2012 16:00:00 GMT'); 

Основная проблема такого подхода заключается в том, что вы не можете аннулировать этот кэш. Это означает, что если вы хотите перерисовать все, чтобы что-то обновить на странице, вам придется ждать истечения срока действия кэша.

ETags лучше контролировать, но сложнее реализовать:

$etag = md5($pageId); 
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) 
    && false !== stripos($_SERVER['HTTP_IF_NONE_MATCH'], $etag)) { 
    header('HTTP/1.1 304 Not Modified'); 
    die; 
} else { 
    header('ETag: '.$etag); 
    //draw the page 
} 

Когда браузер попадает на страницу в первый раз, страница обращается и ETag заголовок подается. В следующий раз, когда браузер попадет на страницу, он отправит заголовок HTTP-запроса If-None-Match с предыдущим значением ETag. Сервер должен сравнить этот заголовок с текущим ETag, если они одинаковы, серверу необходимо отправить пустой объект и 304 Not Modified. ETag может быть любым, что идентифицирует содержимое и версию страницы уникальным образом.

Последнее изменение работает подобно ETags, но вместо серверных тегов он использует даты. Сравнение даты должно быть выполнено с учетом последующих и предыдущих дат.

Section 13 of the HTTP specification охватывает все эти механизмы и его ошибки. Это тяжелое чтение, но оно того стоит.

+0

Это больше похоже на то, что мне нужно. Я попробую это и обязательно загляну в ETag. Спасибо, альганет за ваше время! – Nate

+0

Это, похоже, не проблема с кнопкой «Назад». – Nate

+0

Попробуйте взаимодействовать со страницей, на которой включен Firebug и последующие запросы на вкладке Net. Вы должны увидеть, как запросы кэшируются. Кроме того, есть заголовки, которые влияют на механизм кэширования, например, Cookies. – alganet