Управление кешированием.

Panchous

Павел
Управление кешированием.

Проблема в следующем:
в админке при редактировании записи можно поменять картинку. При аплоде картинка копируется в спец. каталог, а путь хранится в БД.
При сабмите происходит следующее:
1. методом ПОСТ идут данные с картинкой на сервер
2. скрипт сохраняет картинку и данные, делает редирект с GET'ом
3. пользователь должен видеть обновленную страницу

но при смене картинки, увидеть новую можно только после рефреша страницы.

Для управления кешем использую мета-теги в HTML и HTTP-заголовки.
HTML:
Код:
[PHP]
<META http-equiv="Pragma" content="no-cache"> 
<META http-equiv="Cache-Control" content="no-cache">
<META http-equiv="Expires" content="Wed, 26 Feb 1997 08:21:57 GMT"> 
[/PHP]
PHP:
Код:
[PHP]
header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', FALSE); 
header('Pragma: no-cache'); 
[/PHP]
после редиректа с GET'ом имею такие заголовки:
Код:
GET /admin/news.php?mode=edit&news=1&status=update HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Referer: http://tmp/admin/news.php?mode=edit&news=1&status=update
Accept-Language: ru
UA-CPU: x86
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Maxthon; SV1; .NET CLR 1.1.4322)
Host: tmp
Connection: Keep-Alive
Pragma: no-cache
Cookie: PHPSESSID=f5704dd949dad8a370ada2f526c9cfc7

HTTP/1.1 200 OK
Date: Wed, 24 Aug 2005 08:27:32 GMT
Server: Apache/1.3.33 (Win32)
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Pragma: no-cache
X-Powered-By: PHP/5.0.4
Set-Cookie: PHPSESSID=f5704dd949dad8a370ada2f526c9cfc7; path=/
Last-Modified: Wed, 24 Aug 2005 08:27:32 GMT
Connection: close
Content-Type: text/html; charset=windows-1251
Подскажите, чего я не учел.
Спасибо.
______________
PS: В поиске был...
 

Сергей123

Новичок
А имя картинки что - не меняется при редактировании? Это жёсткое требование?
 

Panchous

Павел
имя картинки не меняется
оно имеет спец. вид типа: image_XXX.jpg,
где XXX - id записи
 

Сергей123

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

slach

Новичок
дык это ты кешируешь news.php а не картинку
картинка все равно в кеше

можно попробовать решение с рандомайзом
document.write('<img src="image_XXX.jpg?r='+Math.Random()+'">');
 

Panchous

Павел
есть способ отменить кеширование картинок со стороны сервера?
 

Screjet

Новичок
При аплоаде картинки меняется modify-time, который автоматически получает браузер. Так что высылать хидеры не обязательно.
А для рефреша используй JS, типа
document.location.reload();
 

alexhemp

Новичок
Panchous

Дата-время последнего изменения файла изменятся автоматически, при записи.

Браузер же сделает запрос с заголовком If-Modified-Since, Apache по умолчанию обрабатывает такие запросы как нужно, т.е. кодом 304 если файл не изменился иначе отдаст новый файл.
 

Мутник

Новичок
Panchous

как тебе уже сказали, выдавать картинку вида

<img src="image_XXX.jpg?r=3432">
 

Panchous

Павел
Автор оригинала: alexhemp
Дата-время последнего изменения файла изменятся автоматически, при записи.
а как же это?
разве при аплоаде это не происходит?

-~{}~ 25.08.05 10:43:

Обращаюсь к знающим!
Подскажите, как решить проблему.
 

Screjet

Новичок
Кеш-проксы по дороге нема?
Одинаково ли поведение в разных браузерах?
 

Screjet

Новичок
Загадки какие-то..
ИЕ имеет какойто глюк в "быстрых сетях", может и у оперы то же самое. Есть ли возможность попробовать через шейпер?

Может, придется менять дизайн приложения: формы делать popup, которые будут релоадить страничку посредством JS.
 

Screjet

Новичок
поясните, пожалуйста.
Иногда, для правильного тестирования приложения приходится ограничивать скорость обмена данными с локальным веб-сервером посредством шейпера (shaper). т.е. эмулировать скорость выделенки, дайлапа, етц..
popup категорически не хочу использовать
Попробуй делать редирект через промежуточный скрипт. Авось поможет..
 

kruglov

Новичок
Panchous

> Content-Type: text/html; charset=windows-1251

Это у вас картинки с такими заголовками выдаются? Подозреваю, что страницы.

Вы должны отдавать картинки с вот этими разными no-cache и пр.
 

autosoft

Guest
Можно так

<img src="image.php?ID=100">

PHP:
<?php

$empty = array (
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x21,
0xf9, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00,
0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x02, 0x0e, 0x84,
0x8f, 0xa9, 0xcb, 0xed, 0x0f, 0xa3, 0x9c, 0xb4, 0xda, 0x8b,
0xb3, 0x3e, 0x05, 0x00, 0x3b);

$id = isset($_GET["ID"]) ? (integer) $_GET["ID"] : "";

$file = "images/image_{$id}.jpg";

if (is_integer($id) && file_exists($file)) readfile($file);
else foreach($empty as $byte) echo chr($byte);

?>
 
Сверху